簡體   English   中英

如何在基本表單中獲取繼承表單的大小?

[英]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()中定義的所有屬性都已設置為派生類的值。
當然包括NameTextSize

在這里, thisFormDerived ,其構造函數中設置了所有屬性:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM