【问题标题】:How to get the size of an inherited form in the base form?如何在基本表单中获取继承表单的大小?
【发布时间】:2019-04-19 07:28:41
【问题描述】:

假设您有一个名为 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 的任何其他形式?

供参考,这是MainForm中AddToFormSizes的代码

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

【问题讨论】:

  • 我认为您无能为力。 formTest 的大小在formTest.InitializeComponent() 中设置(更改),FormBase 对此一无所知。在此之前,formTest.Size 是从FormBase 派生的大小。
  • 移动这个东西(它编译吗?):Program.MainForm.AddToFormSizes(this, this.Size);protected override void OnHandleCreated(EventArgs e),在 base.OnHandleCreated(e); 之后。在您的 base 表单中。
  • @Jimi 好主意!这似乎确实有效。我的立场是正确的。
  • @Jimi 是的,可以编译。 MainForm 只是Program.cs 中的一个静态引用,用于访问我的主窗体。我会试试这个建议谢谢
  • 顺便说一句,您不需要 MainFormProgram.cs 中的静态引用。您只需将AddToFormSizes() 设为静态即可。您可以从MainForm 中的实例成员调用它。

标签: c# winforms visual-inheritance


【解决方案1】:

问题
使用Form 作为其他表单的基础,在基类构造函数中,this 引用返回基类的Size,而不是@987654324 @ 派生类。

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();    
}

第一次创建类时:

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() 中定义的所有属性都已设置为派生类的值。
当然包括NameTextSize

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

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

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

【讨论】:

    猜你喜欢
    • 2013-09-17
    • 2015-06-25
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    相关资源
    最近更新 更多