C#のDockPanelSuiteでレイアウトの保存・読込

DockPanel Suiteを使って作ったドッキングウインドウのアプリケーション。

各ウインドウの位置を保存して、次起動したときにその位置を復元する方法についてまとめてみます。


レイアウトの保存と読み込み

レイアウトを保存する

・子ウインドウに名前を付ける

DockContentクラスを継承したフォームでGetPersistStringメソッドをオーバーライドする。

このメソッドで返す名前をキーにしてレイアウト位置が保存される。

※同一フォームクラスを複数配置する場合は、名前が重複しないよう制御が必要

 

・アプリケーション終了時にXMLファイルに保存する

DockPanelクラスのSaveAsXmlメソッドを呼び出してレイアウトをファイルへ保存する。

レイアウトを読み込む

・名前に対応する子ウィンドウを返すメソッドを作成する

 

・アプリケーション開始時にXMLファイルを読み込む

DockPanelクラスのLoadFromXmlメソッドを呼び出してレイアウトをファイルから読み込む。

子ウィンドウがShowされているとエラーになるので、保存ファイルがある時は読み込み、

ない時は必要な子ウィンドウをShowする。

サンプルコード

    // 子ウィンドウ
    public partial class FormSub : WeifenLuo.WinFormsUI.Docking.DockContent
    {
        public FormSubMap()
        {
            InitializeComponent();
        }

        protected override string GetPersistString()
        {
            return "FormSub";
        }        
    }



    // 親ウィンドウ
    public partial class FormMain : Form
    {
        private FormSub m_FormSub;

        public FormMain()
        {
            InitializeComponent();
        }

        private void FormMain_Load(object sender, EventArgs e)
        {
            m_FormSub = new FormSub();
            if (System.IO.File.Exists("DockLayout.xml"))
            {
                m_CtrlDockPanel.LoadFromXml("DockLayout.xml", new DeserializeDockContent(GetDockContentFromPersistString));
            }
            else
            {            
                m_FormSub.Show(m_CtrlDockPanel);
            }
        }

        private IDockContent GetDockContentFromPersistString(string persistString)
        {
            // GetPersistString()メソッドが返す名前に合わせたフォームを返す
            switch( persistString )
            {
                case "FormSub":
                    return m_FormSub;
            }
            return null;
        }
    }