60

对于 winforms 应用程序,我想知道应该输入什么设置代码:

  • 主窗体()

  • MainForm_Load(对象发送者,EventArgs e)

这里有最佳实践指南吗?

4

2 回答 2

83

使用过 VB6 的程序员往往会在 Load 事件中放入大量代码,在 VB6 中,该事件用于初始化表单。但这在 Windows 窗体中不再合适,Form 类可以有一个构造函数。.NET 的方式是在构造函数中初始化类对象,对于 Form 类没有什么令人信服的理由不这样做。

Load 事件在窗体的窗口句柄创建后立即运行,就在它对用户可见之前。您应该只在取决于创建句柄的事件处理程序中编写代码。没有很多代码符合这个要求,除了一种:需要知道窗口大小和位置的代码。

当窗体在另一台机器上运行时,窗体的设计时大小和位置属性值与其实际值不同。可以重新调整表单以适应目标机器上的系统字体大小或视频适配器 DPI 设置。用户偏好也起作用,用户可能为窗口标题选择了不同的字体大小。您通常不关心这些,除非您希望窗口在桌面上具有特定位置或与其他窗口对齐。

在 Load 事件中编写代码来执行诸如初始化 TreeView 或 ListView 控件之类的操作实际上会大大减慢启动时间。当您在构造函数中执行此操作时,Windows 窗体不必更新物理窗口,它尚未创建。一旦创建了本机控件,Winforms 就会使用批量更新来初始化它,而不是像在 Load 事件中运行代码时那样一次一个节点/项目。巨大差距。

最后但同样重要的是:你不应该使用 Load 事件,你应该重写 OnLoad() 方法。当您(或其他人)从您的 Form 类继承时,这可确保代码以可预测的顺序运行。IntelliSense 可帮助您编写此方法,只需键入“protected onl”并按 Tab 即可让 IntelliSense 自动完成该方法。请注意您如何选择在 base.OnLoad() 调用之前或之后放置代码,这就是您控制谁是老板的方式。当你把它放在后面时,你就是老板,顺便说一句,这通常不是正确的选择。

于 2010-03-26T11:51:28.557 回答
10

Have a quick look at Use Constructor in Windows Forms to Ensure Proper Initialization

Use the Constructor in a Windows Form for ensuring that initialization is done properly. Event firing order is not an exact science, and you cannot always depend on the order in which events fire, regardless of what you have seen in the past.

....

For this reason Microsoft recommends that you handle initialization code in the Forms Constructor, assuming that you do not have a really time-comsuming initialization that could get time-sliced or do a DoEvents().

于 2010-03-26T06:05:00.410 回答