Пользовательский контроль Winform: DesignMode не возвращает true, тогда как в режиме разработки
Я узнал о DesignMode здесь Как обновить пользовательский элемент winform во время разработки после изменения свойства
Но когда в конструкторе моего настраиваемого элемента управления я его использую, он никогда не возвращает true, поэтому, когда я перетаскиваю свой собственный элемент управления, он всегда показывает max = 200, так что неправильно?
if (this.DesignMode)
{
this.Min = 0;
this.Max = 100;
}
else
{
this.Min = 0;
this.Max = 200;
}
this.LabMin.Text = this.Min.ToString();
this.LabMax.Text = this.Max.ToString();
Ответы
Ответ 1
LicenseManager.UsageMode
предназначен для этого.
На самом деле это единственный надежный способ определить, находится ли ваш контроль в режиме разработки или нет. Он действителен только во время конструктора, но его можно легко сохранить в поле класса для последующей ссылки.
Свойство DesignMode
для вложенных элементов управления будет ложным, даже если элемент управления контейнера находится в режиме разработки.
Ответ 2
Может быть, что элемент управления должен также иметь связанный с ним ISite
, иначе он всегда будет возвращать false
Индикатор режима разработки сохраняется в ИСИТ; поэтому, если Компонент не имеет ISITE, связанного с это значение этого свойства равно ложь.
Источник: MSDN
Изменить. Также см. этот пост, поскольку у кого-то была аналогичная проблема с тем, с которым вы столкнулись
Проблемы с конструкторами Windows Forms и DesignMode
Изменить 2. Я также нашел сайт, который, как представляется, указывает на то, что это обычная проблема с настраиваемыми элементами управления, но в нем также перечислены некоторые работы. Вы можете найти его здесь:
Задача режима пользовательского контроля
Ответ 3
Для того, что я помню в Ctor, свойство DesignMode еще не имеет значения. Вы должны использовать его после initializeComponents или в обработчике событий.
Ответ 4
Для любого, кто придет к этой теме, есть другой способ справиться с этим.
Если вы реализуете ISupportInitialize для своего элемента управления winforms, код разработчика вызовет инициализацию начала/конца вашего элемента управления.
затем, для всех ваших изменений времени разработки и времени выполнения, вы можете настроить метод EndInitialization. к этому времени для свойства Site.DesignMode будет установлено значение True/False.
Мне также нравится добавлять логический уровень класса, то есть bool _initializing = false; так что я могу отслеживать это состояние в других местах.
это, кажется, наименее "хакерский" способ обработки таких вещей.