C#-C# WinForm中的Shown事件到底是什么时候引发的?

发布于 2016-11-03 22:42:38 字数 946 浏览 1818 评论 2

我看到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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

浮生未歇 2017-08-05 09:27:52

WinForm事件基本是由WM消息控制的,就比如Click事件。
我们说事件是同步的,消息是异步的。
Shown事件实际指的是WM_SHOWWINDOW消息被Form2接收到时所引发的事件。
而WM_SHOWWINDOW是由Application发送到Form2的消息。调用了Show方法只是向Application发送了消息,而不是向Form2发送了消息。所以Shown事件是在Cilck事件之后发生。
而form2.label1.Text在未显示之前仅仅只是改变值,并不引发绘制或重绘(即WM_PAINT消息),只有在显示之后才会引发绘制或重绘(即WM_PAINT消息)。

夜无邪 2016-11-11 23:20:23

我在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();之后的代码会紧跟着执行

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文