вторник, марта 30, 2010

Главное соблюдать режим

В процессе разработки я столкнулся с весьма интересной проблемой: как в WinForms приложении определить в каком режиме сейчас находится контрол? То есть, понятно, что внутри контрола есть свойство DesignMode, которое и призвано ответить на этот вопрос. Но только когда разрабатываемый контрол помещается на форму, то он из режима редактирования быстренько перескакивал в рантайм, то есть это возвращало нам false. Столкнувшись с этим непонятным поведением я подумал, что, кто-то на эти грабли уже наступал, и простой запрос гуглу вернул мне кучу обсуждений, где во всю горланили, что это баг такой, что свойство это некорректно, что надо обходными путями проверять. В большинстве мест глобальный разум подсказывал простое решение: спросить текущий процесс, а не процесс ли он среди разработки:
System.Diagnostics.Process.GetCurrentProcess().ProcessName.Equals("devenv")
Но такое решение показалось мне не очень понравилось, потому как разрабатывать приложения можно не только в Visual Studio, а, следовательно, в другом редакторе такой способ не поможет.
В общем начал я исследовать это свойство DesignMode и выяснил очень приятный момент! Если, например, его проверять в конструкторе контрола, то нам возвращается false, а если в OnLoad или в InitLayout, то он, вуаля, всё работает правильно! Если мы находимся в редакторе, проверка свойства DesignMode внутри всех методов и свойств контрола, кроме конструктора, возвращает true, а если же приложение запущено, то нам приходит false. В общем свойство это работает так, как ему и следует. Удивляет одно - я нигде не увидел корректного совета о том, что проверять это поле надо не в конструкторе, а позднее.

Комментариев нет:

Отправить комментарий