【问题标题】:Order of events 'Form.Load', 'Form.Shown' and 'Form.Activated' in Windows FormsWindows 窗体中的“Form.Load”、“Form.Shown”和“Form.Activated”事件顺序
【发布时间】:2011-03-05 10:50:39
【问题描述】:

Form.LoadForm.ShownForm.Activated 事件形式的区别是什么?他们被解雇的顺序是什么?

【问题讨论】:

  • 永远、永远、永远不要计算 WINFORMS 中的事件顺序!事实上,尽可能少地使用事件,如果/当你使用很多时,它们应该只调用一些完成大部分工作的常用子程序。诚然,事件的顺序不会改变,但这种编程风格是在寻找错误(根据我自己的经验,不幸的是大多数是其他人的经验)。也不要在 StackOverflow 评论中大喊大叫!
  • @Anthony:MessageBox 是一种很棒的 方式来搞乱事件顺序。它将使 Shown 事件在 Load 事件结束之前运行。永远不要使用 MessageBox 调试 UI 事件,最好使用 Debug.WriteLine()。
  • 我在加载、显示和激活事件中使用了 Debug.WriteLine - 感谢 Hans :)。输出窗口将事件顺序显示为加载、激活和最终显示。

标签: c# .net winforms events


【解决方案1】:

此外,Form.Activate 事件可以被多次触发。例如,如果您从表单中打开一个消息框,当您单击消息框的任何按钮并返回表单时,Form.Activate 将被触发。对于任何其他对话框(例如FileOpenDialog)也是如此。

【讨论】:

  • 另外:还没有在 .net 中实际测试过它以确定它的行为是否相同,但我知道在 vb6 中,如果您一次单步执行一行代码,它会命中表单加载事件,而不是激活事件,当您不明白原因时可能会产生误导。
  • Activated 事件是否会创建表单的新实例?
【解决方案2】:

Form 和 Control 类公开了一组与应用程序启动和关闭相关的事件。当 Windows 窗体应用程序启动时,主窗体的启动事件按以下顺序引发:

Control.HandleCreated
Control.BindingContextChanged
Form.Load
Control.VisibleChanged
Form.Activated
Form.Shown

当应用程序关闭时,主窗体的关闭事件按以下顺序引发:

Form.Closing
Form.FormClosing
Form.Closed
Form.FormClosed
Form.Deactivate

焦点和验证事件

当您通过使用键盘(TAB、SHIFT+TAB 等)、调用 Select 或 SelectNextControl 方法或将 ActiveControl 属性设置为当前窗体来更改焦点时,会发生 Control 类的焦点事件按以下顺序:

Enter
GotFocus
Leave
Validating
Validated
LostFocus

当您使用鼠标或调用 Focus 方法改变焦点时,Control 类的焦点事件按以下顺序发生:

Enter
GotFocus
LostFocus
Leave
Validating
Validated

【讨论】:

    【解决方案3】:

    顺序是Form.Load,它初始化表单并调用控件,Form.Shown,它将框架标记为可见(即使在C++,这是在创建表单之后完成的),以及@987654324 @,为论坛提供焦点。

    【讨论】:

    • 这是不对的。我使用了 Debug.WriteLine - 输出窗口将事件序列显示为加载、激活和最后显示。
    • “调用控件”是什么意思?
    【解决方案4】:
    • Load 事件在表单初始化时触发,在创建句柄之后但在显示之前。

    • 当您调用form.Show()(或form.Visible = true)时,在表单首次可见后,Shown 事件会触发。
      如果您隐藏表单,然后再次显示,Shown 将再次触发。 (但Load 不会)

    • Activate 事件在用户切换到您的表单时触发。
      如果用户切换到不同的程序(或表单),然后切换回您的表单,Activate 将再次触发。

    【讨论】:

    • 这不准确,显示只触发一次。
    • @Hans:错了。我刚试过。如果你调用ShowDialog 两次,Shown 会触发两次。
    • 嗯,不知道你在做什么。装火两次。不释放对话框通常是一个错误。
    • 根据MSDN documentationShown 应该只触发一次。在您致电ShowDialog 之后,表格是否已关闭(或者无论如何,不应该关闭)?我觉得这可能是一种非典型情况,两次调用ShowDialog
    • Load 将在每次关闭表单后调用ShowDialog 时触发。这很容易重现:var f = new Form(); f.Load += (s, e) => MessageBox.Show("Loaded"); f.ShowDialog(); f.ShowDialog();。多次调用ShowDialog 并不是一个典型的场景。复杂的表单可能需要几秒钟来初始化,因此关闭并重用它们是有意义的,而不是每次都处理和重新创建新实例。
    【解决方案5】:

    Windows Forms Events Lifecycle

    • Move:移动表单时发生此事件。虽然默认情况下,当一个表单被实例化并启动时,用户并没有移动它,但是这个事件在 Load 事件发生之前就被触发了。
    • 加载:此事件在表单首次显示之前发生。
    • VisibleChanged:当 Visible 属性值更改时发生此事件。
    • 已激活:当表单在代码中或由用户激活时发生此事件。
    • 显示:只要表单首次显示,就会发生此事件。
    • Paint:重绘控件时发生此事件。
    • 停用:当表单失去焦点并且不是活动表单时发生此事件。
    • Closing:当窗体关闭时发生此事件。
    • Closed:当窗体关闭时发生此事件。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 2018-03-17
    相关资源
    最近更新 更多