Form.Owner语言 - 拥有的表单不递归关闭/隐藏



MSDN 文档指出:

当一个表单归另一个表单所有时,该表单将关闭或隐藏,并带有 所有者窗体。例如,考虑由 Form2 拥有的名为 的窗体 名为 Form1 的表单。如果Form1关闭或最小化,Form2 关闭或隐藏。

显然隐藏不是递归工作?当我有一堆 4 个彼此育儿的表单(GrandChildForm.Owner = Child; ChildForm.Owner = ParentForm;等(时,最小化其中任何一个只会最小化它的直接孩子。

关闭其中一个窗体时类似的效果,仅引发直接子项的 FormClosesing/Closed 事件,而不会引发其他访问者的事件。同样,文档没有说明这在递归上不起作用:

如果表单具有任何子表单或拥有的表单,则FormClosing事件也是 为每个人筹集。如果任何一个表单取消事件,则无 的表格已关闭。

我想要实现的目标:

    最小化/恢复
  • 表单也应该最小化/恢复其所有祖先。
  • 关闭
  • 表单应该沿着表单的层次结构向下到"最小的"孩子,如果他们中的任何一个决定不关闭(FormClosingEventArgs.Cancel = true;(,那么交易就结束了。

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

您可以从此类继承表单:

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);
        }
    }
}

或者只在"关闭"和"大小更改"事件处理程序中使用此类中的代码。

最新更新