Ignite UI for Blazor のドックマネージャー (IgbDockManager) において、指定した ContentId を持つペインを、コードから最大化したり、あるいはドックマネージャーの最大化の状態を解除したりするには、ドックマネージャーの “MaximizedPane” プロパティに、目的のペインのオブジェクトを設定する、または null 値を設定することで実現可能です。
ただし本記事作成時点では、Blazor のコード側からの操作にはいくつか制約があるため、すべてのシナリオに対応できるようにするためには、JavaScript プログラムを追加して、JavaScript 側から、Ignite UI for Blazor のドックマネージャー (IgbDockManager) がレンダリングする <igc-dockmanager> 要素に対して直接の操作を行なう必要があります。
例えば下記のような JavaScript ファイルを配置して、
// helper.js /** * 第1引数に指定されたペインの集合を再帰的に検索し、第2引数に指定された contentId を * 持つペインのレイアウトオブジェクトを探し出して返します。見つからない場合は null が * 返ります。 */ const findPane = (panes, contentId) => { for (const pane of panes) { if (pane.type === "contentPane") { if (pane.contentId === contentId) return pane; } else if (typeof (pane.panes) !== "undefined") { return findPane(pane.panes, contentId); } } return null; } /** * 第1引数に指定された CSS セレクタで指定される要素の中から、igc-dockmanager 要素を * 探し出し、第2引数に指定された contentId を持つペインを最大化します。第2引数 * contentId に null を指定した場合は、最大化を解除します。 */ export const setMaximizedPane = (selector, contentId) => { // 操作対象の igc-dockmanager 要素を探し当てます const dockManagerContainer = document.querySelector(selector); const dockManager = dockManagerContainer?.querySelector( "igc-dockmanager"); // contentId に null を指定された場合は、DockManager の maximizedPane プロパ // ティに null を設定することで、最大化を解除します。 if (contentId === null) dockManager.maximizedPane = null; else { // DockManager の layout プロパティ以下にツリー構造で格納されているレイアウト // オブジェクト群から、目的の contentId を持つペインのレイアウトオブジェクトを // 探し出します。 const panes = [...(dockManager.layout.rootPane?.panes || []), ...(dockManager.layout.floatingPanes || []) ]; const pane = findPane(panes, contentId); // 最大化対象のレイアウトオブジェクトが見つかったら、いったん、DockManager の // アクティブ化と最大化を確実に解除してから、対象のレイアウトオブジェクトをアク // ティブ化して、それから、最大化ペインに指定することで、確実に最大化します。 if (pane !== null) { dockManager.maximizedPane = null; dockManager.activePane = null; dockManager.activePane = pane; dockManager.maximizedPane = pane; } } }
こうして配置した JavaScript 中でエクスポートされている setMaximizedPane 関数を、Blazor 側から JavaScript 相互運用機能を使って呼び出すことで、指定した ContentId を持つペインを最大化したり、あるいは最大化を解除したりすることができます。下記はその実装例です。
@* *.razor *@ @inject IJSRuntime JSRuntime <IgbDockManager id="dockmanager1" ...> ... </IgbDockManager> <IgbButton @onclick="OnClickMaximizePane1"> Pane 1 を最大化 </IgbButton> @code { // [Pane 1 を最大化] ボタンがクリックされたときに呼び出されます。 private async Task OnClickMaximizePane1() { // JavaScript 相互運用機能を介して、igc-component 要素の maximizedPane // プロパティに、指定した ContentId (ここでは "pane1") を持つペインを設定 // することで最大化します。 await using var module = await this.JSRuntime .InvokeAsync<IJSObjectReference>("import", "./helper.js"); await module.InvokeVoidAsync( "setMaximizedPane", "#dockmanager1", "pane1"); }
なお、上記サンプルコードは、要点を強調するために実装を簡略化しています。例えば上記サンプルコードでは、JavaScript ファイルを毎回読み込んでは破棄していますが、実際上は、読み込んだ JavaScript ファイル (JavaScript モジュール) はフィールド変数にキャッシュしておき、コンポーネントが破棄されるときに破棄するようにすべきです。
そのような実装も組み込んだ、完全に動作する Blazor WebAssembly サンプルプログラムのソースコード “KB10081_BlazorWasmApp.zip” を以下に添付します。実際に作り込みされる際には、こちらをご参照ください。
また、この方法でコードからドックマネージャー内のペインを最大化したり最大化を解除したりした場合は、KB10021「IgbDockManager – ペインが最大化されたかどうかを検知する」でご紹介しているドックマネージャーの最大化状態の変更検知は起動されませんので、その点ご注意ください。
その他、IgbDockManager を使った実装例につきましては、下記リンク先のブログ記事もあわせてご参照ください。
ドックマネージャーによる高度なレイアウト機能を備えた、コンポーネントを動的に追加できる Blazor アプリケーションを作る (前編) – インフラジスティックス・ジャパン株式会社Blog (infragistics.com)