如何在基本表单中获取继承表单的大小?

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.
NameTextSize 当然包括在内。

在这里,thisFormDerived,其构造函数中设置了所有属性:

public class FormBase : Form
{
    public FormBase() => InitializeComponent();

    protected override void OnHandleCreated(EventArgs e)
    {
         base.OnHandleCreated(e);
         Program.MainForm.AddToFormSizes(this, this.Size);
    }
}