メニュー コマンドのテキストを変更する

次の手順は、IMenuCommandService サービスを使用してメニュー コマンドのテキスト ラベルを変更する方法を示しています。

IMenuCommandService を使用したメニュー コマンドのラベルの変更

  1. ChangeMenuText という名前のメニュー コマンドを使用して、MenuText という名前の VSIX プロジェクトを作成します。 詳細については、「メニュー コマンドを使用した拡張機能の作成」を参照してください。

  2. .vsct ファイルで、次の例に示すように、メニュー コマンドに TextChanges フラグを追加します。

    <Button guid="guidChangeMenuTextPackageCmdSet" id="ChangeMenuTextId" priority="0x0100" type="Button">
        <Parent guid="guidChangeMenuTextPackageCmdSet" id="MyMenuGroup" />
        <Icon guid="guidImages" id="bmpPic1" />
        <CommandFlag>TextChanges</CommandFlag>
        <Strings>
            <ButtonText>Invoke ChangeMenuText</ButtonText>
        </Strings>
    </Button>
    
  3. ChangeMenuText.cs ファイルで、メニュー コマンドが表示される前に呼び出されるイベント ハンドラーを作成します。

    private void OnBeforeQueryStatus(object sender, EventArgs e)
    {
        var myCommand = sender as OleMenuCommand;
        if (null != myCommand)
        {
            myCommand.Text = "New Text";
        }
    }
    

    また、OleMenuCommand オブジェクトの VisibleCheckedEnabled の各プロパティを変更することによって、この方法でメニュー コマンドの状態を更新することもできます。

  4. ChangeMenuText コンストラクターで、コマンドの初期化と配置を行う元のコードを、メニュー コマンドを表す (MenuCommand ではなく) OleMenuCommand を作成し、BeforeQueryStatus イベント ハンドラーを追加し、このメニュー コマンドをメニュー コマンド サービスに提供するコードに置き換えます。

    そのコードは次のようになります。

    private ChangeMenuText(AsyncPackage package, OleMenuCommandService commandService)
    {
        this.package = package ?? throw new ArgumentNullException(nameof(package));
        commandService = commandService ?? throw new ArgumentNullException(nameof(commandService));
    
        var menuCommandID = new CommandID(CommandSet, CommandId);
        var menuItem = new OleMenuCommand(this.Execute, menuCommandID);
        menuItem.BeforeQueryStatus += new EventHandler(OnBeforeQueryStatus);
        commandService.AddCommand(menuItem);
    }
    
  5. プロジェクトをビルドし、デバッグを開始します。 Visual Studio の実験用インスタンスが表示されます。

  6. [ツール] メニューに Invoke ChangeMenuText という名前のコマンドが表示されます。

  7. このコマンド クリックします。 MenuItemCallback が呼び出されたことを通知するメッセージ ボックスが表示されます。 このメッセージ ボックスを閉じると、[ツール] メニューにあるコマンドの名前が New Text になっていることがわかります。