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)

Tagged:

製品について

Ignite UI for Blazor