VSTO開発におけるRibbonの動的メニュー読み込み

概要

Visual Studio開発環境において、VSTO(Visual Studio Tools for Office)の開発では、微软が 이미 개발자에게 제공한 디자이너 모드의 리본 开发 기능을 이용할 수 있습니다. 전통적인 VBA나 ExcelDna, 기타 COM 추가 기능 개발 방식과 비교할 때, XML 리본을 직접 작성할 필요 없이, 윈도우 폼 컨트롤을 드래그 앤 드롭하는 것처럼 쉽게 리본 기능을 개발할 수 있어 개발 효율이 매우 높습니다.

이러한 개발 방식은 리본에 대한高度なカスタマイズが必要ない一般的なシーンに適しています。一般的には、プラグイン開発者として、ユーザーにリボンにボタンを配置し、ボタンをクリックして特定の機能を実行させることができれば十分です。

ただし、動的にメニューを読み込みたい 경우에는、デザイン時のリボン開発においても、XMLリボン相比更容易に実装できます。ここでは3つの具体的なシーン介紹します。

シーン1:特定の条件下でのみボタンを表示

特定の条件下でのみリボンボタンを表示したい場合があります。例えば、ユーザーがデータ範囲を選択しており、なおかつ単一のセルだけを選択している場合にのみ、特定のボタンを表示するケースがあります。

実装例:

public void OnSelectionChangeHandler(object sender, Excel.Range targetRange)
{
    try
    {
        // 単一のセルが選択され、かつデータ領域が存在する場合
        if (targetRange.Cells.CountLarge == 1 && targetRange.CurrentRegion.Cells.CountLarge > 1)
        {
            // リボンボタンを表示
            Globals.Ribbons.Ribbon1.DynamicButton.Visible = true;
        }
        else
        {
            // ボタンを非表示
            Globals.Ribbons.Ribbon1.DynamicButton.Visible = false;
            
            // 関連するタスクパネルも非表示にする
            var taskPanel = TaskPanelHelper.FindPanelByTitle("DataSelectionPanel");
            if (taskPanel != null)
            {
                taskPanel.Visible = false;
            }
        }
    }
    catch (Exception)
    {
        // 例外を無視
    }
}

シーン2:メニュー項目数を動的に読み込み

メニュー以下の内容が固定されていないケースは、ユーザーの設定ファイルに基づいて動的にメニュー項目を読み込む必要があります。例えば、設定データの内容によってメニューアイテムを動的に生成する場合が該当します。

動的メニュー機能の実装手順:

  1. MenuコントロールのDynamicプロパティを有効にする
  2. ItemsLoadingイベントを処理する
public void OnMenuItemsLoading(object sender, RibbonControlEventArgs e)
{
    try
    {
        // タスクパネルを表示
        TaskPanelHelper.ShowTaskPanel("FormatSettingsPanel",
                                       typeof(NumberFormatControl),
                                       CustomTaskPaneCollection.FormatSettings,
                                       450,
                                       true);

        // メニューアイテムを動的に生成
        RibbonMenu menuControl = sender as RibbonMenu;
        menuControl.Items.Clear();
        
        // 設定データからメニューアイテムを生成
        foreach (ConfigurationData.FormatItem item in ConfigurationManager.Settings.FormatItems)
        {
            RibbonButton buttonItem = Globals.Ribbons.Ribbon1.Factory.CreateRibbonButton();
            buttonItem.Name = "formatBtn" + item.Index;
            buttonItem.Label = item.DisplayName;
            buttonItem.Click += OnFormatButtonClick;
            menuControl.Items.Add(buttonItem);
        }
    }
    catch (Exception ex)
    {
        Logger.Error("メニュー生成エラー", ex);
    }
}

シーン3:特定のリボンタブにジャンプ

コード実行後に特定のリボンタブにジャンプさせたい場合があります。例えば、プラグインの機能を実行した後、ユーザーが引き続き插件のリボンタブ停留在し、次の操作を行えるようにしたいケースがあります。

しかしながら、コード実行後にチャートやListObject(スマートテーブル)之类的オブジェクトが生成されると、リボンは自動的にこれらのオブジェクト 관련된タブに切り替わり、プラグインのタブが失去焦点します。

以下のコードを使用して、指定したリボンタブをアクティブ化できます:

// プラグインのリボンタブをアクティブ化
Globals.Ribbons.Ribbon1.RibbonUI.ActivateTab("CustomAddinTab");

注意点:ActivateTabメソッドのパラメータは、表示名(Label)ではなく、自分で定義したTabのNameを指定する必要があります。

まとめ

VSTO開発におけるリボン开发には、以下の利点があります:

  • デザイナーMODE用于快速开发,无需手動でXMLリボンを記述
  • コントロールの動的表示/非表示が容易
  • メニュー項目の動的追加が灵活
  • コールバック関数の多くが自動的に処理される

VSTOには独自の制約がありますが、上記のような灵活な开发機能が提供される点は、VSTO开发の大きなメリットと言えます。 XMLリボン相比、開発生産性を大幅に向上させることができます。

タグ: vsto Excel Ribbon office-addins csharp

10月12日 09:56 投稿