Problem:
用一个Form
作为其他表单的基础,在基类构造函数中,this
引用返回Size
基类而不是Size
的派生类。
public class FormBase : Form
{
public FormBase()
{
InitializeComponent();
Program.MainForm.AddToFormSizes(this, this.Size);
}
}
只需遵循事件的顺序即可:
FormDerived derived = new FormDerived()
=> FormBase.InitializeComponent()
=> FormDerived.InitializeComponent()
derived.Show()
=> FormBase.OnHandleCreated()
给定一个 Form 的构造函数,派生自FormBase
:
public class FormDerived : FormBase
{
public FormDerived() => InitializeComponents();
}
当类第一次创建时:
FormDerived derived = new FormDerived();
derived.Show();
基类的构造函数(FormBase
)首先被调用。
此时,this
参考设置为FormDerived
,但所有属性,包括Name
和表格的标题(Text
),设置为基类的值。
因此,调用一个使用的方法this
在基类构造函数中:
Program.MainForm.AddToFormSizes(this, this.Size);
this.Size
将返回基类的 Size,而不是派生类的 Size。
The FormDerived
接下来调用构造函数。此时,定义的所有属性InitializeComponent()
方法将被设置。
If the AddToFormSizes()
方法被移至派生类构造函数,this
将参考预期值。但是,静态方法调用必须插入到每个派生类中FormBase
.
The AddToFormSizes()
方法可以移动到被重写的方法并从被重写的方法中调用OnHandleCreated()
基类的方法,当派生 Form 首次显示时将调用该方法:
derived.Show();
将导致调用FormBase.OnHandleCreated()
.
此时,this
引用已设置为派生类以及中定义的所有属性InitializeComponent()
将已经设置为派生类的值。
Name
, Text
and Size
当然也包括在内。
Here, this
is FormDerived
在其构造函数中设置所有属性:
public class FormBase : Form
{
public FormBase() => InitializeComponent();
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
Program.MainForm.AddToFormSizes(this, this.Size);
}
}