XamDockManager でいろいろなところに表示されているペインをボタンクリックで 1 か所にまとめてタブ表示させたい場合は、以下のナレッジベース記事の内容を順にコードで実装していきます。
1. XamDockManager のすべての ContentPane を取り出す。
「XamDockManager – ContetnPane をすべて取り出す方法」
https://kb.jp.infragistics.com/?p=12049
2. 1 で取り出した各 ContentPane を DocumentContentHost に移動し、タブにまとめる。
「XamDockManager – コードを使って ContentPane を現在の親ペインから別のペインに移す方法」
https://kb.jp.infragistics.com/?p=12053
「XamDockManager – すべてのペインをタブにまとめて表示する方法(XAML版)」
https://kb.jp.infragistics.com/?p=12037
1. XamDockManager のすべての ContentPane を取り出す。
「XamDockManager – ContetnPane をすべて取り出す方法」
https://kb.jp.infragistics.com/?p=12049
を実装します。次の 2 の処理のときに ContentPane を移動させながらforeachを回していくことになるので、移動処理の影響を受けないよう、コピーを使うようにします。
// XamDockManagerが持っている全てのContentPaneを取り出し、List<T>オブジェクトとしてそのコピーを受け取る。 // ※移動させながらforeachを回していくことになるので、移動処理の影響を受けないよう、コピーを使うようにします。 var allContentPanes = xamDockManager1.GetPanes(PaneNavigationOrder.VisibleOrder).ToList();
2. 1 で取り出した各 ContentPane を DocumentContentHost に移動し、タブにまとめる。
「XamDockManager – コードを使って ContentPane を現在の親ペインから別のペインに移す方法」
https://kb.jp.infragistics.com/?p=12053
「XamDockManager – すべてのペインをタブにまとめて表示する方法(XAML版)」
https://kb.jp.infragistics.com/?p=12037
を実装していきます。
まずはペインの移動の時に必要になってくる親ペインからの削除の処理を書きます。ひとまとまりの処理なので、1 つのメソッドで定義・実装しましょう。
// ContentPaneを現在の親Paneから削除する処理をするメソッドです。
// 第1引数: 対象となるContentPane
private void RemoveContentPane(ContentPane contentPane)
{
// ContentPaneのもともとのCloseAction(ペインをクローズしたときにただクローズするか親Paneから削除もするかを指定するプロパティ)値を保存しておく。
var originalCloseAction = contentPane.CloseAction;
// 一時的にCloseActionをRemovePane(クローズと同時に親Paneからも削除する)値に変更する。
contentPane.CloseAction = PaneCloseAction.RemovePane;
// ContentPaneをクローズする(CloseActionの値に基づき、親Paneからも削除される)。
contentPane.ExecuteCommand(ContentPaneCommands.Close);
// もとのCloseActionに戻す。
contentPane.CloseAction = originalCloseAction;
}
次に、各 ContentPane を移動させながら DocumentContentHost にタブでまとまる構造を作っていきます。この記事のタイトルにあるように、ボタンクリックでまとめるので、ボタンクリックイベントハンドラーで実装します。
// 「全てのペインをDocumentContentHostにタブでまとめる」ボタンのクリックイベントハンドラー
private void putAllPanesInDocHostButton_Click(object sender, RoutedEventArgs e)
{
var documentContentHost = (DocumentContentHost)xamDockManager1.Content;
var rootSplitPane = (SplitPane)documentContentHost.Panes[0];
var tabGroupPane = (TabGroupPane)rootSplitPane.Panes[0];
// XamDockManagerが持っている全てのContentPaneを取り出し、List<T>オブジェクトとしてそのコピーを受け取る。
// ※移動させながらforeachを回していくことになるので、移動処理の影響を受けないよう、コピーを使うようにします。
var allContentPanes = xamDockManager1.GetPanes(PaneNavigationOrder.VisibleOrder).ToList();
// XamDockManagerの各ContentPaneについて
foreach (var contentPane in allContentPanes)
{
// XamDockManager
// - DocumentContentHost
// -- SplitPane
// --- TabGroupPane
// ---- ContentPane
// ---- ContentPane
// ...(以下、ContentPaneの繰り返し)...
// という構造を作ると、DocumentContentHostにまとめてタブ表示にすることができます。
//
// 以下のコードはこの構造を作成しているコードです。
// DocumentContentHostのTabGroupPaneに含まれていないContentPaneの場合、
if (!tabGroupPane.Items.Contains(contentPane))
{
// 現在の親Paneから削除し、...
RemoveContentPane(contentPane);
// TabGroupPaneに追加する。
tabGroupPane.Items.Add(contentPane);
}
}
}
実行結果

ボタンクリックですべての ContentPane が 1 か所にタブでまとまって表示されるようになりました!