2

假设您有一个名为的表单FormBase,并且所有其他表单都继承自该表单。
例如,我有public class Form formTest : FormBase

我现在在 formTest 的 ctor 中拥有什么:

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

供参考,这是AddToFormSizesMainForm 中的代码

private Dictionary<Form, Size> _formSizes = new Dictionary<Form, Size>();
public void AddToFormSizes(Form form, Size size)
{
    _formSizes.Add(form, form.Size);
}
4

1 回答 1

3

问题
使用 aForm作为其他表单的基础,在基类构造函数中,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和 Form 的 Caption ( Text),都设置为基类的值。
因此,调用this在基类构造函数中使用的方法:

Program.MainForm.AddToFormSizes(this, this.Size);

this.Size将返回基类的大小,而不是派生类。

接下来FormDerived调用构造函数。此时,InitializeComponent()方法中定义的所有属性都将被设置。

如果将AddToFormSizes()方法移动到派生类的构造函数,this将引用预期值。但是,静态方法调用必须插入到FormBase.

AddToFormSizes()方法可以改为移动到OnHandleCreated()基类的重写方法并从其调用,该方法将在派生的 Form 首次显示时调用:

derived.Show();

将导致调用FormBase.OnHandleCreated().

此时,this引用已设置为派生类,并且其中定义的所有属性都已 InitializeComponent()设置为派生类的值。
Name,当然TextSize包括在内。

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

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

    protected override void OnHandleCreated(EventArgs e)
    {
         base.OnHandleCreated(e);
         Program.MainForm.AddToFormSizes(this, this.Size);
    }
}
于 2019-04-19T10:21:09.407 回答