Winforms - порядок загрузки и активации событий
Один из наших пользователей отправил в журнал для нашего приложения .NET Winforms, которое указывает, что событие Activated
встречается до события Load
. Я не думал, что это возможно и закодировано с предположением, что Load
всегда будет происходить до Activated
.
Наблюдал ли кто-нибудь еще Activated
, предшествующий Load
?
Если да, то почему и есть ли способ убедиться, что этого не происходит?
Ответы
Ответ 1
Из порядка событий в Windows Forms на MSDN:
События запуска и завершения работы приложения
Классы Form и Control предоставляют набор событий, связанных с запуском и закрытием приложения. Когда запускается приложение Windows Forms, события запуска основной формы генерируются в следующем порядке:
System.Windows.Forms.Control.HandleCreated
System.Windows.Forms.Control.BindingContextChanged
System.Windows.Forms.Form.Load
System.Windows.Forms.Control.VisibleChanged
System.Windows.Forms.Form.Activated
System.Windows.Forms.Form.Shown
Когда приложение закрывается, события завершения работы главной формы генерируются в следующем порядке:
System.Windows.Forms.Form.Closing
System.Windows.Forms.Form.FormClosing
System.Windows.Forms.Form.Closed
System.Windows.Forms.Form.FormClosed
System.Windows.Forms.Form.Deactivate
Используете ли вы MessageBox в каких-либо ваших событиях запуска? Это может привести к тому, что события будут появляться не по порядку из-за того, как цикл сообщений Windows Forms обрабатывает диалоговые окна.
Ответ 2
Активируется перед загрузкой. Если вы хотите написать код, который должен быть выполнен после загрузки, вы можете использовать способ показа.
Ниже приведена последовательность:
- Активированный
- Load
- Показано
РЕДАКТИРОВАТЬ: Пожалуйста, проверьте этот очень интересный ответ на SO, который объясняет события WinForms Load vs. Shown
EDIT: у меня есть одно значение по умолчанию Проект Winform с одиночной winform. Теперь он дает мне последовательность
- Load
- Активированный
- Показано
Теперь я запутался.
Ответ 3
Несмотря на то, что это противоречит документации Microsoft, это может случиться, когда вы обращаетесь к публичной переменной или функции формы загрузки извне формы. Если необходимо, вы можете установить флаг в показанном событии и использовать его для выхода из активированного обработчика до загрузки формы.