Подтвердить что ты не робот

Пользовательский контроль 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();  
4b9b3361

Ответ 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; так что я могу отслеживать это состояние в других местах.

это, кажется, наименее "хакерский" способ обработки таких вещей.