C# 如何知道何时加载并显示了所有控件?
Windows窗体应用程序中事件的实际顺序是什么 我的意思是,当我将代码放入C# 如何知道何时加载并显示了所有控件?,c#,.net,winforms,C#,.net,Winforms,Windows窗体应用程序中事件的实际顺序是什么 我的意思是,当我将代码放入Form\u show事件时,我希望代码只在表单显示后运行: 动词(与宾语连用),show,show或show,show。1.引起 或者让别人看到…- 但是显示的表单事件有点误导。如果我在该事件中做了一些繁重的工作,那么代码似乎是在表单显示完成之前执行的。假设我有一个主菜单,一个小的工具栏和一个文本框 我想做一些繁重的事情(目前不需要线程和工作线程…),所以我可以使用的最后一个事件应该是Form\u show。因此,我将
Form\u show
事件时,我希望代码只在表单显示后运行:
动词(与宾语连用),show,show或show,show。1.引起
或者让别人看到…-
但是显示的表单
事件有点误导。如果我在该事件中做了一些繁重的工作,那么代码似乎是在表单
显示完成之前执行的。假设我有一个主菜单
,一个小的工具栏
和一个文本框
我想做一些繁重的事情(目前不需要线程和工作线程…),所以我可以使用的最后一个事件应该是Form\u show
。因此,我将繁重的代码放在那里,但当表单开始显示时,我会等待5-6秒,等待工具栏
和要显示的内容(这最终发生在繁重的代码完成任务之后)
这让我相信我订阅了错误的事件。我根本不想看到表单_
事件。我真正需要的是:
Form_,当所有事件均未显示事件时
那么,我怎么知道所有的东西(控件)什么时候都被完全加载和显示了呢?显示的事件实际上是引发的与初始化相关的最后一个事件。但是,请注意,在Windows(和其他平台)中,UI对象的实际呈现(屏幕上绘制)是延迟。UI对象的创建只会分配所有必要的资源,并使对象的可视区域“无效”。平台随后会安排渲染事件(在非托管窗口中,这是WM_PAINT
,在Winforms API中,这将是控件
实例的PAINT
事件)
在UI对象的线程可用之前,无法调度呈现事件。如果在显示的事件中有长时间运行的代码,则会使UI对象的线程在代码期间不可用。即,在代码完成之前,不会绘制任何内容
当事情“稳定下来”时,您还可以使用其他事件更可靠地检测。例如,事件会告诉您主应用程序线程何时将进入空闲状态。或者,您可以只订阅表单的事件。在任何一种情况下,您都希望使用来分派长时间运行的代码,以便不阻止对这些事件的处理
现在,所有这些都表明:你真的不应该在UI线程中执行任何长时间运行的工作,句号。使用上述任何一个事件都不能解决根本问题;它只是将问题延迟到UI的初始呈现之后。在执行长时间运行的工作时,UI仍然会被阻塞,坦率地说,用户可能会实际上,我发现根本没有UI比有一些看起来他们可以交互但他们不能交互的东西(即对他们的输入没有响应)更可取
在最新版本的.NET中,有一些非常好的机制可用于将长时间运行的工作转移到后台线程,以便用户界面能够保持响应。请参阅C#中的和。如果愿意,您可以使用较旧的BackgroundWorker
对象来完成相同的任务。如果您正在做繁重的工作(5-6秒!),UI将冻结(而不是重新绘制)那么长时间,无论你将其放入哪个事件。如果真的需要这么长时间,你应该真正研究backgroundworker或线程(我知道,你说了没关系,但仍然)@Blorgbeard是的。我已经有backgroundworker事件(尽管现在是空的)补充。我只是有点心烦意乱,去搜索,在这上面找不到任何东西。现在我不知道如何判断所有东西何时都显示了。我相信有一天它会派上用场的……你能不能不用表单.Load
处理程序来执行“重载”操作显示表单前的代码?您需要使用后台线程来执行繁重的工作。在主UI流中执行繁重且长时间的操作会冻结表单。即使创建了菜单和工具栏并向用户显示,它们也不会工作,直到工作完成。