在WinForm中,哪里是更好的初始化工作位置?

8
在Load事件中或在InitializeComponent()之后的构造函数中?
还是完全没有关系?

可能是Winforms Form Constructor vs Load event的重复问题。 - Jim Fell
6个回答

5
Form.Shown事件是一个很好的地方来进行任何需要超过一秒钟的初始化。Form.Shown仅在窗体首次向用户显示后发生一次。
显然,如果您有一个冗长的初始化过程,仍然需要提供某种形式的视觉反馈,并可能禁用表单的某些部分,直到完成。但是,如果初始化是不可避免的,Form.Shown至少可以让用户知道应用程序没有冻结,并提供有关它实际正在执行的反馈。
与Form.Load相比:从用户的角度来看,因为您的Form已经可见,所以您的应用程序将被认为启动更快。
与Form.Activated相比:您不需要担心初始化会多次运行,因为Activated事件在每次隐藏/显示、最小化/最大化等操作时都会调用。
与构造函数相比:类似于Form.Load,直到初始化完成,您的窗体才会可见。此外,您必须更加注意与控件相关的时间/序列问题,这些控件可能尚未完全初始化。

1
我尝试使用Shown事件,但发现它并不像你描述的那样工作:每次显示对话框时,该方法都会被再次运行。因此,如果我使用它来填充列表框,那么每次对话框被显示时,列表项都会重复出现。我感到困惑... - Stewart

4

对于较重的初始化,通常在加载事件中完成。构造函数通常用于快速、简单的字段初始化。例如,如果您必须调用外部依赖项的方法,则应该从加载事件中进行。


3

在加载事件中进行较重的初始化可能不是一个好主意,因为它可能会增加加载时间并且会让最终用户感到烦恼。我更喜欢在表单加载时进行基本的初始化(例如...需要<10秒),并在显示给用户后进行其余的重要工作。为了让用户等待,可以显示进度指示器。


2

这取决于初始化的类型。例如,简单的字段初始化可以在构造函数中完成,这样可以避免您必须挂钩事件、有额外方法等。

然而,在某些情况下,构造函数没有您需要的信息。例如,如果您想根据是处于设计模式还是运行模式来执行不同的操作(例如,在运行模式下,您将连接到数据源,但在设计模式下,您想显示示例数据),那么必须推迟到构建之后,因为框架直到对象构建后才设置DesignMode。


其实不是这样的。您可以在构造函数中检查LicenseManager.UsageMode(仅限构造函数)以检查是否处于设计模式。 - Eric

1
在Load事件中执行操作,当它失败时,异常信息会更容易阅读,而且在我看来语义更清晰。实际上,这并没有太大的区别。

0

想象一下,如果您两次运行相同的窗体时运行ShowShowDialog会发生什么。那两个调用之间不能更改的所有内容都应该在构造函数中;所有依赖于相应的Show(Dialog)调用的初始化代码必须在事件处理程序中,每个调用都将调用该处理程序。例如,窗体的所有者是通过ShowDialog传递的,而不是在构造函数中,对于2个不同的ShowDialog调用可能不同,因此所有依赖于所有者的内容都不应该在构造函数中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接