当前位置:  开发笔记 > 开发工具 > 正文

Windows窗体中的加载与显示事件

如何解决《Windows窗体中的加载与显示事件》经验,为你挑选了2个好方法。

希望我只是遗漏了一些明显的东西,但我试图了解Windows窗体中 Load和Shown事件之间的差异.

传统上,我只使用Load(或实际上是OnLoad,因为我认为覆盖一个方法比依靠设计者自己连接一个事件更干净),因为在所有版本的.NET中都可以使用它.使用.NET 2.0,引入了Shown事件.

现在,如果你在MSDN文档中查看这些描述("加载:第一次显示表单之前发生.","显示:每当表单首次显示时发生.")听起来像Load事件应该发生,然后表格应该可见,然后应该发生显示事件; 两者的结合使您可以在表格可见之前和之后执行某些任务.有道理,对吗?

但是,实验表明Shown事件总是发生 Load事件之前,每当我尝试它时(两者都发生在表单变得可见之前).然而,当我发现一个关于这些事件被触发的命令的页面时,我在谷歌周围时,他们总是列出首先被触发的Load事件.

我只是疯了,还是我错过了什么?(如果它们确实在大约同一时间发生,那么为什么首先添加了已显示的事件?)

(我目前在显示表单之前和之后做某事的解决方案是使用OnLoad进行"显示之前"的操作并为"显示后"的东西启动一个短时间的一次性计时器.哪个工作正常且可靠,但是它有点难看,我希望有一个更清洁的解决方案.但看起来显示的事件不是它.)



1> Hans Passant..:

避免使用MessageBox.Show()来调试它.它会引发一个消息循环,干扰正常的事件流.该负载事件是由Windows发送WM_SHOWWINDOW消息,就在窗口变得可见触发.没有Windows通知"您的窗口现在已经完全显示",因此WF设计人员想出了一个生成Shown事件的技巧.它们使用Control.BeginInvoke(),确保在程序再次空闲并重新进入消息循环后立即调用OnShown()方法.

这个技巧有很多其他用途,特别是当你不得不延迟事件启动的代码执行时.但是,在您的情况下,它会因为您使用MessageBox.Show()而崩溃.它的消息循环调度使用BeginInvoke()注册的委托,导致在显示窗口之前运行Shown事件.

除了MessageBox之外,还有很多其他方法可以获得诊断.Debug.Print()和Console.WriteLine()很方便,它们的输出转到Visual Studio输出窗口,而不会对正常事件触发序列产生任何不利影响.一个简单的断点也可以创造奇迹.



2> 小智..:

这是我追踪的事件序列.这可以帮助其他人决定他们如何调用或设置他们的自定义事件处理

追踪事件

表格 - 客户端大小已更改:8/14/2010 10:40:28 AM
表单 - 已添加控件 - button1:8/14/2010 10:40:29 AM
表单 - 构造函数:2010年8月14日上午10:40:29
表格 - 处理创建时间:2010年8月14日上午10:40:29
表格 - 无效:2010年8月14日上午10:40:29
表格 - 表格加载活动:8/14/2010 10:40:29 AM
表格 -已加载:8/14/2010 10:40:29 AM
表格 - 创建控件:2010 年8月
14日上午10:40:29 表格 - OnActivated:2010
年8月14日上午10:40:29 表格 - 显示:8/14/2010上午10时40分29秒
表- OnPaint中:8/14/2010上午10时40分29秒
表-失效:8/14/2010上午10时40分29秒
表- OnPaint中:8/14/2010 10:上午40:29

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有