C# DockPanelSuite を使った Docking Window アプリの作り方(ウィンドウの再表示編)

で問題だった、1度閉じてしまったウィンドウの再表示について。

何も設定しない状態だと DockPanel 内のフォームを閉じると Dispose されてしまうようだ。
こうなると再表示する際に新たに new Form() することになる。
これだと、フォーム内にテキストボックスなどがあった場合閉じる際に内容を保存しておき、再表示する際に復帰させたりしないといけない。これはちょっと面倒なので別の方法がないか探してみた。

DockContent.HideOnClose プロパティ

HideOnClose が true の場合、閉じられた際に実際には閉じずに Hide するだけにするという機能があったのでこれを使う。

再表示用のメニューを作る

Form1 のデザイナで次のようなメニューを作成する。

DockPanelSuite-form-menu

それぞれのメニューのに以下のようにイベントを実装する。

windowDropDownOpeningメニューが開かれる直前
Form2Clickメニューがクリックされた時
Form3Click メニューがクリックされた時
Form4Click メニューがクリックされた時

Form1 のソースを編集

using WeifenLuo.WinFormsUI.Docking;

public partial class Form1 : Form
{
    // dockPanel1 で管理するフォーム達
    private Form2 form2 = null;
    private Form3 form3 = null;
    private Form4 form4 = null;

    public Form1()
    {
        InitializeComponent();

        // フォーム達を生成して dockPanel1 で表示を開始する
        form2 = new Form2();
        form2.Text = "Form2";
        form2.HideOnClose = true; // 閉じられた時に非表示にするだけ
        form2.Show(dockPanel1);

        form3 = new Form3();
        form3.Text = "Form3";
        form3.HideOnClose = true; // 閉じられた時に非表示にするだけ
        form3.Show(dockPanel1);

        form4 = new Form4();
        form4.Text = "Form4";
        form4.HideOnClose = true; // 閉じられた時に非表示にするだけ
        form4.Show(dockPanel1);

    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        // 掃除
        form2?.Dispose();
        form3?.Dispose();
        form4?.Dispose();
    }

    private void windowToolStripMenuItem_DropDownOpening(object sender, EventArgs e)
    {
        // メニューが開かれる直前:見えなくなっているフォームのメニューだけ有効化する
        form2ToolStripMenuItem.Text = form2.IsHidden ? "Form2 を表示" : "Form2 を消す";
        form3ToolStripMenuItem.Text = form3.IsHidden ? "Form3 を表示" : "Form3 を消す";
        form4ToolStripMenuItem.Text = form4.IsHidden ? "Form4 を表示" : "Form4 を消す";
    }

    private void form2ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        if(form2.IsHidden) { form2.Show(); } else { form2.Hide(); } // Form2 の再表、非表示切り替え
    }

    private void form3ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        if(form3.IsHidden) { form3.Show(); } else { form3.Hide(); } // Form2 の再表、非表示切り替え
    }

    private void form4ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        if(form4.IsHidden) { form4.Show(); } else { form4.Hide(); } // Form2 の再表、非表示切り替え
    }
}

これでドックウィンドウの表示、非表示切り替えができるようになった。

DockPanelSuite-form-menu-exe

DockPanel にはレイアウトの状態を保存、読み込む機能もあるようなのでそちらも試してみようと思う。

注意

今回の方法はあくまで1例となる。
Formを実際には閉じず見えなくするだけだとリソースがもったいない。見えなくなっても陰で動作しているのはなんか嫌。
というような方向けではないデス。

次回へ続く。 続いた。