2

MSDNのドキュメントには次のように記載されています。

フォームが別のフォームによって所有されている場合、そのフォームは所有者フォームで閉じられるか非表示になります。たとえば、という名前Form2のフォームが所有するという名前のフォームについて考えてみForm1ます。Form1閉じているか最小化されている場合は、Form2閉じているか非表示になっています。

どうやら、隠蔽は再帰的に機能していませんか?互いに親である(GrandChildForm.Owner = Child; ChildForm.Owner = ParentForm;など)4つのフォームのスタックがある場合、それらのいずれかを最小化すると、直接の子も最小化されます。

これらのフォームの1つを閉じるときの同様の効果は、直接の子の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 に答える