【发布时间】:2012-02-17 22:33:38
【问题描述】:
我有一个 .NET 控件,用户可以将其放在表单上。
Visual Studio 创建一个InitializeComponent,从宿主窗体的构造函数中调用:
public EditItemForm()
{
InitializeComponent();
}
这个自动生成的方法,在一个自动生成的文件中,根据设计器可序列化规则初始化我的控件。例如:
private void InitializeComponent()
{
...
this.lvResults = new Contoso.Controls.VirtualGrobber();
...
//
// lvResults
//
this.lvResults.BorderStyle = System.Windows.Forms.BorderStyle.None;
...
//FrobGrobberForm
...
this.Controls.Add(this.lvResults);
...
}
我,一个坐在某人表单上的控件,如何知道所有设计器序列化何时完成,并且我“准备好了”?
在Delphi中,在控件中序列化的机制会自动调用每个控件的Loaded方法:
在从流中加载控件后对其进行初始化。
procedure Loaded; override;说明
VCL 流系统调用 Loaded 在控件的表单加载到内存后自动 控件可以完成任何依赖于其他的初始化 表单中的对象。
【问题讨论】:
-
您可以通过多种不同的方式来做到这一点。哪个是惯用的或合适的实际上取决于您要初始化的确切内容。当然,设计器并没有做任何神奇的事情,它只是在您的控件上设置属性。并且设计自定义控件的标准规则是属性应该能够以任何顺序设置,无论是由用户还是设计者。
-
实现ISupportInitialize接口。
-
@HansPassant
我实现了 ISupportInitialize,并将代码放入 EndInit(),但它从未被调用。实施 ISupportInitialize 是否应该做点什么?我收回它。一旦您构建了两次,设计者就会在InitializeComponent期间添加对EndInit()的调用。真的应该以答案的形式表达出来。