Директива препроцессора "Режим проектирования"

У меня есть проблема при отображении компонента в Designer.

Я определил "плохой" код, который не нравится дизайнеру.

Теперь проблема заключается в том, что я не могу "прокомментировать" ее для времени разработки только с помощью препроцессорных директив.

Теперь я попробовал (для VB.NET) следующий

#If Not Debug Then
Private Sub myWpfComponent_ItsEvent(sender, args) Handles myWpfComponent.ItsEvent
...
#End If 

этот... работал, и теперь он отображается без проблем в дизайнере.

Проблема теперь, когда я боюсь, не сможет отлаживать правильно этот компонент.

Итак, я ищу обходное решение à la

#If Not DESIGN_TIME Then
#End If 

Есть ли что-то подобное?

Ответ 1

Вы не можете добиться этого через препроцессор. Это связано с тем, что вы можете запустить исполняемый файл отладки вне VS (попробуйте, дважды щелкните EXE, сгенерированный VS в режиме отладки).

Во всяком случае, существует свойство runtime (не на основе препроцессора), которое может помочь:

if (System.ComponentModel.LicenseManager.UsageMode ==
    System.ComponentModel.LicenseUsageMode.Designtime)

Эти веб-страницы помогут и имеют другие методы проверки для режима разработки во время выполнения:

http://msdn.microsoft.com/en-us/library/c58hb4bw(vs.71).aspx

http://weblogs.asp.net/fmarguerie/archive/2005/03/23/395658.aspx

Ответ 2

IDE не перестраивает ваш код, чтобы показать конструктор. Он использует бинарный файл, который вы уже создали. Поэтому директива препроцессора не поможет.

Поскольку вы упоминаете myWpfComponent_ItsEvent, я предполагаю, что это вопрос WPF. В WPF вы обнаруживаете режим разработки, используя GetIsInDesignMode.

Ответ 3

Использование:

if (!DesignerProperties.GetIsInDesignMode(this))
{
   //Code to not execute in design mode
}

Обратите внимание, что идентификатор "this" может быть любым DependencyObject

Ответ 4

Ваша проблема заключается в использовании элемента управления WPF, написанного на VB.NET в дизайнере WinForms. Если обработчик события вызывает проблемы, вы можете использовать AddHandler вместо WithEvents и Handles для условного кода вашего обработчика. Когда вы используете AddHandler, вы можете обернуть добавление обработчика в If, используя методы, описанные в ответе @gmagana.

См. этот ответ для разницы между дескрипторами и AddHandler: