[英]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
作為其他 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 的標題 ( 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
、 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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.