Как получить код в конструкторе, который НЕ будет выполняться во время разработки Visual Studio?
У меня есть вызов метода в конструкторе моего пользовательского элемента управления, который делает что-то, что не будет работать во время разработки (подключение к базе данных), а Visual Studio просто выйдет, когда я попытался добавить этот элемент управления в GUI-конструктор.
Конечно, я могу разделить этот код на отдельный метод, но мне не нравится идея, что каждый раз, когда я использую этот объект, мне нужно помнить о выполнении определенного метода, который необходим для этой функции объекта (что конструктор для!).
Есть ли что-то вроде символа препроцессора, чтобы я мог пометить свой код так, чтобы Visual Studio не пыталась выполнить этот код во время разработки?
Ответы
Ответ 1
Как утверждали другие, вы можете использовать свойство DesignMode
класса Component
. Однако вы не сможете это сделать в конструкторе вашего контроля. Свойство DesignMode
всегда false
в конструкторе и методах, вызываемых конструктором. Чтобы обойти это, перегруппируйте код для подключения к базе данных в обратном вызове OnLoad()
. Свойство DesignMode
действует в этой точке. См. здесь для рассуждения (найдите раздел DesignMode статьи).
Я просто просмотрел эту запись , в которой описывается, как использовать свойство System.ComponentModel.LicenseManager.UsageMode
для выполнения той же самой вещи. В блоге описывается дополнительный недостаток свойства DesignMode
при работе с вложенными элементами управления. По-видимому, свойство UsageMode
не имеет таких же недостатков и доступно для использования в конструкторе. Я не могу лично ручаться за него, но, возможно, стоит посмотреть.
Ответ 2
В Windows Forms?
if (!DesignMode)
{
// code that shouldn't be executed at design time
}
Как уже упоминалось, это не будет работать в конструкторе. Он часто используется в событии Form.Load
.
Ответ 3
Посмотрите на это
Свойство Component.DesignMode
Ответ 4
Мне понравился подход Майкла Петротты для Windows Forms. Если кто-то хочет применить тот же метод к WPF, просто используйте IsInDesignMode
.
Пример:
public SomeViewModel()
{
if (!IsInDesignMode)
{
DoWork();
}
}
Ответ 5
public SomeViewModel()
{
if (!IsInDesignMode)
{
DoWork();
}
}
Этот код выше, если вы работаете с фактическим пользовательским интерфейсом, над которым вы пытаетесь работать. В ситуации, когда у вас есть что-то вроде этого на элементе управления, когда вы возвращаетесь к дизайнеру для этого элемента управления, это нормально и нет ошибки времени разработки. Теперь, если вы добавили этот элемент управления, который содержит вышеприведенный код, к какой-либо другой форме или другому элементу управления, перетащив его из панели инструментов, он покажет некоторые ошибки времени разработки.