Winforms - 加载和激活事件的顺序

时间:2009-09-16 04:34:24

标签: .net winforms events load

我们的一位用户已经发送了我们的.NET Winforms应用程序的日志,该日志表明Activated事件正在发生 Load事件之前。我不认为这是可能的,并且编码时假设Load总是在Activated之前发生。

是否有其他人在Activated之前发现Load

如果是这样,为什么还有什么方法可以确保它不会发生?

3 个答案:

答案 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的文档,但有时当您从表单外部访问加载表单的公共变量或函数时,也会发生这种情况。如有必要,您可以在显示的事件中设置一个标志,并在表单加载之前使用它来退出激活的处理程序。