gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:54:57 24 4
gpt4 key购买 nike

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

供引用,这是AddToFormSizes的代码在主窗体中

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

最佳答案

问题:
使用 Form 作为其他 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()

给定从 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);
}
}

关于c# - 如何在基本表单中获取继承表单的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55758166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com