如何在基本表单中获取继承表单的大小?
How to get the size of an inherited form in the base form?
假设您有一个名为 FormBase
的表单,所有其他表单都继承自该表单。
例如,我有 public class Form formTest : FormBase
我现在在 formTest 的构造函数中拥有的内容:
public class Form formTest : FormBase
{
public formTest()
{
InitializeComponent();
Program.MainForm.AddToFormSizes(this, this.Size);
}
}
此代码将 formTest
的实例及其 size
添加到主窗体上的字典中
这行得通,但我想将此代码移至 FormBase
,这样我就不必将这行代码放在每个继承的表单中。
public class Form FormBase : Form
{
public FormBase()
{
InitializeComponent();
Program.MainForm.AddToFormSizes(this, this.Size);
}
}
现在,问题是当我这样做时,size
在设计时将具有 FormBase
的大小,而不是 formTest
的大小。
在 FormBase
中有没有办法捕获 formTest
或从 FormBase
继承的任何其他形式的大小?
供参考,这是MainForm
中AddToFormSizes
的代码
private Dictionary<Form, Size> _formSizes = new Dictionary<Form, Size>();
public void AddToFormSizes(Form form, Size size)
{
_formSizes.Add(form, form.Size);
}
问题:
使用 Form
作为其他表单的基础,在基础 class 构造函数中,this
引用 returns Size
的基础 class 而不是派生 class 的 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()
给定从 FormBase
派生的 Form 的构造函数:
public class FormDerived : FormBase
{
public FormDerived() => InitializeComponents();
}
首次创建 class 时:
FormDerived derived = new FormDerived();
derived.Show();
首先调用基础 class (FormBase
) 的构造函数。
此时,this
引用设置为FormDerived
,但所有属性,包括Name
和表单的标题 (Text
),设置为基础值 class.
因此,在基础 class 构造函数中调用使用 this
的方法:
Program.MainForm.AddToFormSizes(this, this.Size);
this.Size
将 return 基础 class 的大小,而不是派生 class 的大小。
接下来调用FormDerived
构造函数。此时,将设置 InitializeComponent()
方法中定义的所有属性。
如果将 AddToFormSizes()
方法移动到派生的 class 构造函数,this
将引用预期值。但是,必须在 FormBase
的每个派生 class 中插入静态方法调用。
可以将 AddToFormSizes()
方法移动到基础 class 的重写 OnHandleCreated()
方法并从中调用,这将是在首次显示派生表单时调用:
derived.Show();
将调用 FormBase.OnHandleCreated()
。
此时,this
引用已经设置为派生的 class 并且 InitializeComponent()
中定义的所有属性都将被已经设置为派生的值 class.
Name
、Text
和 Size
当然包括在内。
在这里,this
是 FormDerived
,其构造函数中设置了所有属性:
public class FormBase : Form
{
public FormBase() => InitializeComponent();
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
Program.MainForm.AddToFormSizes(this, this.Size);
}
}
假设您有一个名为 FormBase
的表单,所有其他表单都继承自该表单。
例如,我有 public class Form formTest : FormBase
我现在在 formTest 的构造函数中拥有的内容:
public class Form formTest : FormBase
{
public formTest()
{
InitializeComponent();
Program.MainForm.AddToFormSizes(this, this.Size);
}
}
此代码将 formTest
的实例及其 size
这行得通,但我想将此代码移至 FormBase
,这样我就不必将这行代码放在每个继承的表单中。
public class Form FormBase : Form
{
public FormBase()
{
InitializeComponent();
Program.MainForm.AddToFormSizes(this, this.Size);
}
}
现在,问题是当我这样做时,size
在设计时将具有 FormBase
的大小,而不是 formTest
的大小。
在 FormBase
中有没有办法捕获 formTest
或从 FormBase
继承的任何其他形式的大小?
供参考,这是MainForm
中AddToFormSizes
的代码
private Dictionary<Form, Size> _formSizes = new Dictionary<Form, Size>();
public void AddToFormSizes(Form form, Size size)
{
_formSizes.Add(form, form.Size);
}
问题:
使用 Form
作为其他表单的基础,在基础 class 构造函数中,this
引用 returns Size
的基础 class 而不是派生 class 的 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()
给定从 FormBase
派生的 Form 的构造函数:
public class FormDerived : FormBase
{
public FormDerived() => InitializeComponents();
}
首次创建 class 时:
FormDerived derived = new FormDerived();
derived.Show();
首先调用基础 class (FormBase
) 的构造函数。
此时,this
引用设置为FormDerived
,但所有属性,包括Name
和表单的标题 (Text
),设置为基础值 class.
因此,在基础 class 构造函数中调用使用 this
的方法:
Program.MainForm.AddToFormSizes(this, this.Size);
this.Size
将 return 基础 class 的大小,而不是派生 class 的大小。
接下来调用FormDerived
构造函数。此时,将设置 InitializeComponent()
方法中定义的所有属性。
如果将 AddToFormSizes()
方法移动到派生的 class 构造函数,this
将引用预期值。但是,必须在 FormBase
的每个派生 class 中插入静态方法调用。
可以将 AddToFormSizes()
方法移动到基础 class 的重写 OnHandleCreated()
方法并从中调用,这将是在首次显示派生表单时调用:
derived.Show();
将调用 FormBase.OnHandleCreated()
。
此时,this
引用已经设置为派生的 class 并且 InitializeComponent()
中定义的所有属性都将被已经设置为派生的值 class.
Name
、Text
和 Size
当然包括在内。
在这里,this
是 FormDerived
,其构造函数中设置了所有属性:
public class FormBase : Form
{
public FormBase() => InitializeComponent();
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
Program.MainForm.AddToFormSizes(this, this.Size);
}
}