InitializeComponent()应该在代码顺序中出现在哪里?

如果我创建了一个winForms“myForm”,那么会生成以下样板代码:

public partial class myForm: Form { public myForm() { //<<position 1 InitializeComponent(); //<<position 2 } } 

如果我将额外的代码添加到构造函数方法,如果我将代码放在位置1或2中,它对应用程序的运行有什么影响吗?

是的,它确实。

InitializeComponent是VS生成的方法,负责在窗体上创建和定位控件。

“位置1”中的代码将在控件存在之前执行。 如果您尝试访问此位置的控件,您将获得NullReferenceException (例如,如果您尝试设置TextBox的内容)。 “位置2”中的类似代码将按预期工作。

但是有一个用于“位置1”:如果你有依赖于表单属性的自定义控件或行为,那么在“位置1”中设置这些属性可能会阻止在允许在那些之前创建控件时必须刷新代码值已设置。

是。 在InitializeComponent之前尚未创建所有控件。

在函数InitializeComponent(); 您可以创建放置在图形布局中的所有对象。 如果你想访问它们,你的代码应该在position2中。

您放在Form上的buttontextboxcombobox会自动创建一些代码。此代码在InitializeComponent()生成

因此,调用从position 1放置在Form上的控件是错误的,因为控件永远不会在该代码点创建。

您可以从position 2调用和访问您在表单上放置的控件

像其他人所说的那样,在大多数情况下应该使用位置2。 但是,也有例外情况,这两个位置都不起作用,您实际上必须将代码附加到另一个事件。

示例:您有一个ScrollViewer和一个Image 。 您在图像组件中插入一个大图像文件,并希望显示它,以便在开始时可以看到图像的中心,并可以选择滚动查看图像的其余部分:

 scrollViewer1.ScrollToVerticalOffset(scrollViewer1.ScrollableHeight / 2); 

但是,在InitializeComponent() (或甚至in)之前或之后在构造函数中写入此内容将不会为您提供所需的结果。 (因为,即使组件已在此阶段初始化,但所包含的图像文件也没有。)而是您需要做的是将新的事件处理程序 ImageOpened附加到Image并在那里编写命令。

ImageOpened EventHandler