C#-C# WinForm中的Shown事件到底是什么时候引发的?
我看到MSDN上的说明为:
只有在首次显示窗体时才会引发 Shown 事件
http://technet.microsoft.com/zh-cn/library/system.windows.forms.form.shown(v=vs.80).aspx
但是我发现Shown事件似乎并不是显示完成后就马上调用的。
举个例子:
namespace FormTest
{
public class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.Show();
form2.label1.Text = "After Show()";
}
}
public class Form2 : Form
{
public Form2()
{
InitializeComponent();
label1.Text = "Initializing";
}
private void Form2_Shown(object sender, EventArgs e)
{
label1.Text = "Shown";
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
WinForm事件基本是由WM消息控制的,就比如Click事件。
我们说事件是同步的,消息是异步的。
Shown事件实际指的是WM_SHOWWINDOW消息被Form2接收到时所引发的事件。
而WM_SHOWWINDOW是由Application发送到Form2的消息。调用了Show方法只是向Application发送了消息,而不是向Form2发送了消息。所以Shown事件是在Cilck事件之后发生。
而form2.label1.Text在未显示之前仅仅只是改变值,并不引发绘制或重绘(即WM_PAINT消息),只有在显示之后才会引发绘制或重绘(即WM_PAINT消息)。
我在Form2中添加了一个public int i = 0;的成员变量,放置了3个label,其中label1设为public,修改代码如下
public class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.Show();
form2.label1.Text = DateTime.Now.ToString("mm:ss.fffff") +" "+ (form2.i++).ToString();
}
}
public partial class Form2 : Form
{
public int i = 0;
public Form2()
{
InitializeComponent();
label2.Text = DateTime.Now.ToString("mm:ss.fffff") + " " + (i++).ToString();
}
private void Form2_Shown(object sender, EventArgs e)
{
label3.Text = DateTime.Now.ToString("mm:ss.fffff") + " " + (i++).ToString();
}
}
执行后表明,执行的顺序为Form2构造函数->button1_Click内剩余代码->Form2_Shown。
分析其原因,Form2构造函数先执行应该没有疑问。Form2_Shown是响应事件而执行的,具体来说,是在WndProc()中响应相关的消息之后调用的,这个消息就是在调用form2.Show();时发出的,响应消息会有一点延时,也就是说,不是紧接着form2.Show();执行。而form2.Show();之后的代码会紧跟着执行