Form.Owner - 所有的表单不会递归关闭/隐藏

时间:2012-08-30 08:54:41

标签: c# .net winforms

MSDN documentation州:

  

当表单由另一个表单拥有时,它将被关闭或隐藏   业主表格。例如,考虑一个名为Form2的表单   名为Form1的表单。如果Form1已关闭或最小化,Form2也是如此   关闭或隐藏。

显然隐藏不是递归工作的?当我有一堆4个形式的彼此为父对象(GrandChildForm.Owner = Child; ChildForm.Owner = ParentForm;等)时,最小化它们中的任何一个只会最小化它的直接孩子。

关闭其中一个表单时,类似的效果只会引发直接子项的FormClosing / Closed事件,但不会引发其他表达式。 Again the docs并未声明这不起作用:

  

如果表单包含任何子表单或拥有表单,则还会发生FormClosing事件   为每个人筹集资金。如果任何一个表单取消该事件,则不会   这些表格已经关闭。

我想要实现的目标:

  • 最小化/恢复表单也应该最小化/恢复它的所有祖先。
  • 关闭表单应该从表单层次结构到“最年轻”的孩子,如果其中任何一个决定不关闭(FormClosingEventArgs.Cancel = true;),那么交易就会结束。

是否应该使用额外的事件处理(订阅所有者的FormClosing / FormClosed / SizeChanged事件)来实现,或者我在这里遗漏了什么?

1 个答案:

答案 0 :(得分: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);
        }

    }
}

或者只是在“Closing”和“SizeChanged”事件处理程序中使用此类中的代码。