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窗体中事件的生命周期。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统