Windows窗体事件生命周期

今天有大量的书籍内容涉及到.NET和Windows Forms。虽然这些书中大多数都讨论了使用Windows窗体的要点,并指导您如何熟练地开发Windows窗体应用程序,很少有书籍波及一个至关重要且非常必要的主题。这个主题就是:Form窗体的事件触发顺序。知道窗体的生命周期可以帮助你将重要的代码放置在相关的事件中。

如果你看ASP.NET的教程和书籍,你会发现很多关于网页生命周期的问题,但是windows Forms生命周期是什么呢?不幸的是,没有多少关于这方面的具体信息。因此,这篇文章的目的就是探讨这个主题,并提供关于窗体事件有见解的知识。

窗体生命周期中的事件,从加载开始到关闭结束如下表所示:

Move:当窗体移动的时候,这个事件会发生;虽然在默认情况下,当窗体实例化和启动时,即使用户没有移动窗体,这个事件也会在Load事件之前触发。

Load:此事件会在窗体第一次显示之前=触发。

VisibleChanged:当Visible属性值发生更改时会触发此事件。

Activated:当窗体在代码中被激活或被用户激活时,会发生此事件。

Shown:每当第一次显示窗体时,会触发此事件。

Paint:当控件重绘时,会触发此事件。

Deactivate:当窗体失去焦点并且不是活动窗口时,会触发此事件。

Closing:当窗体正在关闭时,会触发此事件。

Closed:当窗体关闭,会触发此事件。

让我们通过示例看一下。

1、首先,加载VS并创建windows forms应用程序。

2、设置一个合适的名字并点OK,创建应用程序并打开设计预览。

3、打开窗体属性,最简单的方式是:选择设计预览的窗体,并按F4键。

4、点击事件切换并选择Move事件。

5、双击Move事件,这将导致事件处理程序在代码视图中自动生成。

6、切换回设计预览,在窗体属性窗口中,双击Load事件。

7、类似地,重复操作上面罗列出的所有事件。

8、打开代码视图,添加标记为粗体的代码。

复制代码
 1 using System.IO;
 2 
 3  
 4 
 5 namespace LifecycleDemo
 6 
 7 {
 8 
 9     partial class Form1
10 
11     {
12 
13    StreamWriter sr = new treamWriter("D:\\formevents.txt");
14 
15         /// <summary>
16 
17         /// Required designer variable.
18 
19         /// </summary>
20 
21         private System.ComponentModel.IContainer components = null;
22 
23  
24 
25         /// <summary>
26 
27         /// Clean up any resources being used.
28 
29         /// </summary>
30 
31         /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
32 
33         protected override void Dispose(bool disposing)
34 
35         {
36 
37             if (disposing && (components != null))
38 
39             {
40 
41                 components.Dispose();
42 
43                
44 
45             }
46 
47             base.Dispose(disposing);
48 
49             sr.Close();
50 
51         }
52 
53  
54 
55         #region Windows Form Designer generated code
56 
57         #endregion
58 
59     }
60 
61 }
复制代码

9、打开Form1的代码视图,添加标记为粗体的代码。

复制代码
  1 public partial class Form1 : Form
  2 
  3     {
  4 
  5       
  6 
  7         public Form1()
  8 
  9         {
 10 
 11             InitializeComponent();
 12 
 13         }
 14 
 15  
 16 
 17         private void Form1_Move(object sender, EventArgs e)
 18 
 19         {
 20 
 21             sr.WriteLine("1 - Move event");
 22 
 23         }
 24 
 25  
 26 
 27         private void Form1_Load(object sender, EventArgs e)
 28 
 29         {
 30 
 31             sr.WriteLine("2 - Load event");
 32 
 33         }
 34 
 35  
 36 
 37         private void Form1_Activated(object sender, EventArgs e)
 38 
 39         {
 40 
 41             sr.WriteLine("3 - Activated event");
 42 
 43         }
 44 
 45  
 46 
 47         private void Form1_VisibleChanged(object sender, EventArgs e)
 48 
 49         {
 50 
 51             sr.WriteLine("4 - VisibleChanged event");
 52 
 53         }
 54 
 55  
 56 
 57         private void Form1_Shown(object sender, EventArgs e)
 58 
 59         {
 60 
 61             sr.WriteLine("5 -Shown event");
 62 
 63         }
 64 
 65  
 66 
 67         private void Form1_Paint(object sender, PaintEventArgs e)
 68 
 69         {
 70 
 71             sr.WriteLine("6 - Paint event");
 72 
 73         }
 74 
 75  
 76 
 77         private void Form1_FormClosed(object sender, FormClosedEventArgs e)
 78 
 79         {
 80 
 81             sr.WriteLine("7 -  FormClosed event");
 82 
 83           
 84 
 85         }
 86 
 87  
 88 
 89         private void Form1_FormClosing(object sender, FormClosingEventArgs e)
 90 
 91         {
 92 
 93             sr.WriteLine("8 - FormClosing");
 94 
 95            
 96 
 97         }
 98 
 99  
100 
101         private void Form1_Deactivate(object sender, EventArgs e)
102 
103         {
104 
105             sr.WriteLine("9 - Deactivate");
106 
107        }
108 
109     }
复制代码

10、下一步,保存,建立并执行应用程序。

11、切换到其它应用程序,则窗体不再有焦点。

12、切换回WinForm,则窗体又获得焦点。

13、退出应用程序。

14、打开text文件,formevents.txt。您将看到类似于图中所示的输出。

 

Move、Load、VisibleChanged 和 Activated 事件是在窗体显示之前就会被触发的。然后,Shown事件发生。接下来是Paint事件。这些事件对于任何应用程序都是常见的,并且总是标准的。

当你将焦点切换到其它应用程序,Deactivate事件发生;当窗体重新获得焦点时,Activate事件就会被触发。然后窗体会再次进行重绘,因为它重新获得了焦点。

当尝试关闭窗体时,FormClosing 和 FormClosed事件就会被触发。最终,在窗体关闭后,Deactivate事件再次被触发。如果你再为Dispose插入一个WriteLine语句(到目前为止还没有写入),你会看到这条语句出现在Deactivate事件之后。

结论:这就是你学到的Windows窗体中事件的生命周期。

posted @   chenlight  阅读(585)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示