DockPanel Suiteの使い方 その4

DockPanelに配置したウィンドウは保存、復元させることができます。
(正しくは、DockPanelに関連付いているDockContent)

using System.Windows.Forms;
using System.IO;
using WeifenLuo.WinFormsUI.Docking;
...

        /// <summary>
        /// レイアウトをXMLファイルに保存
        /// </summary>
        /// <remarks></remarks>
        public void SaveDockLayout()
        {
            //XMLにレイアウト情報を書き出す
            this._dockPanel.SaveAsXml(フォルダパス, 設定ファイル名));
        }

        /// <summary>
        /// XMLファイルからレイアウトを復元
        /// </summary>
        /// <remarks></remarks>
        public void LoadDockLayout()
        {
            //デリゲート生成
            DeserializeDockContent deserializeDockContent
                = new DeserializeDockContent(GetDockContentFromPersistString);

            this._dockPanel.LoadFromXml(設定ファイルパス, deserializeDockContent);
        }

        /// <summary>
        /// PersistStringからDockContentを返却
        /// </summary>
        /// <param name="persistString">DockContentの名前</param>
        /// <returns></returns>
        IDockContent GetDockContentFromPersistString(string persistString)
        {
            //persistStringに応じて、対応するDockContentを生成し、それを返却
            if ( persistString.Equals(typeof(OutlineForm).ToString()) )
            {
                return new OutlineForm();
            }
            else if ( persistString.Equals(typeof(ExplorerForm).ToString()) )
            {
                return new ExplorerForm();
            }
            else
            {
                // 複数ある場合(下記)
                string[] parsedStrings = persistString.Split(new char[] { '|' });
                if ( parsedStrings.Length != 2 )
                    return null;

                if ( parsedStrings[0] != typeof(EditorForm).ToString() )
                    return null;

                EditorForm dummyDoc = new EditorForm();
                if ( parsedStrings[1] != string.Empty )
                    dummyDoc.FilePath = parsedStrings[1];

                return dummyDoc;

            }
        }

保存されるXMLファイルには、下のようにPersistStringという、名前が付けられています。
(デフォルトではクラス名)
XMLファイルからLayoutを復元する際は、このPersistStringを読んでくるため、それに対応したDockContentを返すデリゲートを用意しておきます。

  <Contents Count="2">
    <Content ID="0" PersistString="Somali.EditorForm|none" AutoHidePortion="0.25" IsHidden="False" IsFloat="False" />
    <Content ID="1" PersistString="Somali.ExplorerForm" AutoHidePortion="0.25" IsHidden="False" IsFloat="False" />
  </Contents>


同じDockContentクラスで、複数ある場合は、そのクラスのGetPersistString()をオーバーライドして、区別できる名前にしておく必要があります。
上の場合、EditorFormは複数あるため、次のようにファイルパスを末尾に付けて区別できるようにしてあります。

    public partial class EditorForm : WeifenLuo.WinFormsUI.Docking.DockContent
    {
...

        protected override string GetPersistString()
        {
            //ドキュメントのファイルパスを付けて、ユニークなPersistStringにする
            return GetType().ToString() + "|" + FilePath ;
        }

...
    }

あとは、これをプログラムの開始時点、終了時点に適当に追加すればレイアウトを保持することができます。(FloatWindow含む)
ただし、あくまで保存されるのは、DockPanelに関連付いたDockContentのみであるため、親フォームの状態は別に残しておく必要があります。