我们的一位用户已经发送了我们的.NET Winforms应用程序的日志,该日志表明Activated
事件正在发生 Load
事件之前。我不认为这是可能的,并且编码时假设Load
总是在Activated
之前发生。
是否有其他人在Activated
之前发现Load
?
如果是这样,为什么还有什么方法可以确保它不会发生?
答案 0 :(得分:20)
来自MSDN的Order of Events in Windows Forms:
应用程序启动和关闭 事件
Form和Control类公开了一个 与应用程序相关的一组事件 启动和关闭。当一个Windows 表单应用程序启动,启动 主要形式的事件被提出 以下顺序:
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窗体消息循环处理对话框窗口的方式,这可能导致事件看起来不按顺序触发。
答案 1 :(得分:2)
在Load之前激活。如果你想编写一些应该在Load之后执行的代码,那么你可以使用Shown Method。
请在下面找到序列:
- 激活
- 加载
- 所示
编辑:请在SO上查看非常有趣的 answer ,这解释了WinForms加载与已显示事件
编辑:我现在创建了一个默认值 单一winform的Winform项目。 现在它给了我序列
- 加载
- 激活
- 所示
我现在很困惑。
答案 2 :(得分:2)
即使它违反了Microsoft的文档,但有时当您从表单外部访问加载表单的公共变量或函数时,也会发生这种情况。如有必要,您可以在显示的事件中设置一个标志,并在表单加载之前使用它来退出激活的处理程序。