Windows формы дизайн режим универсальное решение - PullRequest
1 голос
/ 04 октября 2019

TL; DR: Существует ли универсальное решение для известной проблемы режима разработки в Windows Forms?

Дизайн форм Windows Forms в значительной степени опирается на визуальный конструктор, который затем генерируетправильный код инициализации (в отличие, скажем, от WPF, где макет окна разработан декларативно). Проблема в том, что часть кода не должна запускаться, если окно или элемент управления находятся в режиме разработки (скажем, загрузка данных из базы данных).

Есть несколько известных решений этой проблемы, но все работаеттолько частично:

  • Component.DesignMode - работает только на элементах управления верхнего уровня (не работает в элементе управления, размещенном на элементе управления) и вообще не работает в конструкторах (где на самом деле этобольше всего нужно)
  • LicenseManager.UsageMode == LicenseUsageMode.Designtime - в свою очередь работает только в конструкторах (поэтому не будет работать - скажем, - в OnPaint метод
  • Проверка текущего процесса devenv.exe - что такое, давайте будем честными, более болезненный обходной путь, чем твердый, детерминированный, рабочий метод

Мне было интересно, есть ли способ детерминированной и повторяемой проверки, находится ли элемент управления или форма в режиме отладки?

Единственное решение, с которым я пришел, - это создать конкретную конфигурацию только для режима разработки, установить переменную компиляции и использовать условную компиляцию:

public MyForm()
{
    InitializeComponent();
#ifndef Design
    ...
#endif
}

Проблемы:

  • Это необходимо переключить вручную
  • Если вы забудете переключить конфигурацию обратно на Debug или Release, половина приложения, вероятно, перестанет работать. Однако это можно решить, быстро остановив сборку в методе Main:

    static void Main()
    {
    #ifdef Design
        #error Exit design configuration first!
    #endif
    }
    

Ссылки:

  1. http://dotnetfacts.blogspot.com/2009/01/identifying-run-time-and-design-mode.html
...