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, это может случиться, когда вы обращаетесь к публичной переменной или функции формы загрузки извне формы. Если необходимо, вы можете установить флаг в показанном событии и использовать его для выхода из активированного обработчика до загрузки формы.