2012-08-30 48 views
2

MSDN documentation狀態:Form.Owner - 國有形式不關閉/隱藏遞歸

當窗體通過另一種形式所擁有,它被關閉或隱藏與所述 所有者形式。例如,請考慮一個名爲Form2的表單,它由 擁有一個名爲Form1的表單。如果Form1已關閉或最小化,則Form2也是關閉或隱藏的 。

顯然隱藏是不遞歸的工作?當我有一堆4個彼此參與的形式(GrandChildForm.Owner = Child; ChildForm.Owner = ParentForm;等)時,最小化他們中的任何一個只會最小化它的直接孩子。

當關閉其中一個表單時,只會引發直接子表單的FormClosing/Closed事件,但不會影響其他的表示器。 Again the docs沒有說明,這並不能遞歸調用

如果一個表單有任何兒童或獨資的形式,一個FormClosing事件也 提出的每一個。如果任何一個表單取消該事件,則表單中沒有任何 已關閉。

我想要實現:

  • 最小化/恢復的形式也應最小化/恢復所有它的祖先。
  • 關閉表格應該沿着表格的層次結構向「最年輕」的孩子走,如果他們中的任何一個決定不關閉(FormClosingEventArgs.Cancel = true;),則交易關閉。

如果這種使用額外的事件處理(訂閱業主FormClosing/FormClosed/SizeChanged事件)還是我失去了一些東西來實現?

回答

3

您可以從該類繼承您的形式:

public class AdvancedForm : Form 
{ 
    protected override void OnFormClosing(FormClosingEventArgs e) 
    { 
     foreach (Form f in this.OwnedForms) 
     { 
      f.Close(); 
     } 

     base.OnFormClosing(e); 
    } 

    protected override void OnSizeChanged(EventArgs e) 
    { 
     base.OnSizeChanged(e); 

     foreach (AdvancedForm f in this.OwnedForms) 
     { 
      switch (this.WindowState) 
      { 
       case FormWindowState.Minimized: 
       case FormWindowState.Normal: 
        f.WindowState = this.WindowState; 
        break; 

       case FormWindowState.Maximized: 
        // just restore owned forms to their original sizes when parent form is maximized 
        f.WindowState = FormWindowState.Normal; 
        break; 
      } 

      // OnSizeChanged must be called, as changing WindowState property 
      // does not raise SizeChanged event 
      f.OnSizeChanged(EventArgs.Empty); 
     } 

    } 
} 

或者只在「關閉」和「SizeChanged將」事件處理程序使用的代碼從這個類。

+0

我猜想這是要走的路,只是想知道我是否錯過了一些東西,因爲文檔不清楚。謝謝! –

+0

OnFormClosing代碼的一個奇怪的副作用是FormClosing事件在層次結構鏈中每兩個形式引發兩次。在我看來,設置所有者(FormClosing爲每個擁有的表單引發)背後的邏輯也正在執行(但僅針對直接子)。 –

+0

我沒有測試過代碼,只是給了你一個想法;)也許刪除base.OnFormClosing(e)會有幫助;) – Dima