2

MSDN 文档指出:

当一个表单被另一个表单拥有时,它会与所有者表单一起关闭或隐藏。例如,考虑由名为Form2的表单拥有的名为 的表单Form1。如果Form1被关闭或最小化,Form2也被关闭或隐藏。

显然隐藏不是递归工作?当我有一堆 4 个相互作为父母的表格时(GrandChildForm.Owner = Child; ChildForm.Owner = ParentForm;等等),最小化其中的任何一个只会最小化它的直接子级。

关闭其中一个表单时的类似效果,仅引发直接子级的 FormClosing/Closed 事件,但不会引发其他访问者。同样,文档没有说明这不能递归地工作:

如果表单有任何子表单或拥有的表单,FormClosing则还会为每个表单引发一个事件。如果任一表单取消事件,则不会关闭任何表单。

我想要达到的目标:

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

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

4

1 回答 1

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”事件处理程序中使用此类的代码。

于 2012-08-30T09:31:03.263 回答