ドッキング レイアウトの保存と復元

ウィンドウのサイズやドッキング位置のレイアウト情報をXMLファイルで保存し、次回の起動時に復元できます。

保存

DockPanelクラスのSaveAsXmlメソッドで書き込みます。

public void SaveAsXml(
    string filename  // ファイル名
    );

これは次のように用います。

protected override void OnFormClosing(FormClosingEventArgs e)
{
    base.OnFormClosing(e);

    this.dockPanel.SaveAsXml(layoutFilename);
}

識別名の変更

ファイルへの保存時にはウィンドウを一意に識別するために、個々のウィンドウにはそのクラス名と同一の名称が付けられます。しかしDockContentを継承したフォームでGetPersistString()をオーバーライドすることで、これを任意の名称に変更できます。

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

同一クラスのウィンドウが複数存在する場合には、これで名称を個別に分けないと正しく読み込めなくなります。

復元

DockPanelクラスのLoadFromXmlメソッドで読み込みます。引数でファイル名と、読み込み対象となるウィンドウを特定するためのメソッドを指定します。

public void LoadFromXml(
    string filename,                           // ファイル名
    DeserializeDockContent deserializeContent  // 文字列からIDockContentのインスタンスを得るためのコールバック
    );

コールバックは次の形式で定義します。

public delegate IDockContent DeserializeDockContent(string persistString);

サンプルコード

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    DeserializeDockContent deserializeDockContent
        = new DeserializeDockContent(GetDockContent);

    this.dockPanel.LoadFromXml(layoutFilename, deserializeDockContent);
}

// ウィンドウの名称に対応する IDockContentを返す
private IDockContent GetDockContent(string persistString)
{
    switch (persistString)
    {
        case "Window1": // GetPersistString()メソッドが返すウィンドウ名称
            return this.dockingWindow1;

        case "Window2":
            return this.dockingWindow2;
    }
    return null;
}

デリゲートをインラインにして、IDockContentの取得にDictionary<TKey,TValue>を利用すると、これは次のようにも記述できます。

Dictionary<string, IDockContent> map = new Dictionary<string, IDockContent>();
map.Add("Window1", this.dockingWindow1);
map.Add("Window2", this.dockingWindow2);

DeserializeDockContent deserializeDockContent = (persistString) =>
{
    IDockContent content;
    map.TryGetValue(persistString, out content);
    return content;
};

this.dockPanel.LoadFromXml(layoutFilename, deserializeDockContent);