メニュー コマンドのテキストを変更する
次の手順は、IMenuCommandService サービスを使用してメニュー コマンドのテキスト ラベルを変更する方法を示しています。
IMenuCommandService を使用したメニュー コマンドのラベルの変更
ChangeMenuText という名前のメニュー コマンドを使用して、
MenuText
という名前の VSIX プロジェクトを作成します。 詳細については、「メニュー コマンドを使用した拡張機能の作成」を参照してください。.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>
ChangeMenuText.cs ファイルで、メニュー コマンドが表示される前に呼び出されるイベント ハンドラーを作成します。
private void OnBeforeQueryStatus(object sender, EventArgs e) { var myCommand = sender as OleMenuCommand; if (null != myCommand) { myCommand.Text = "New Text"; } }
また、OleMenuCommand オブジェクトの Visible、Checked、Enabled の各プロパティを変更することによって、この方法でメニュー コマンドの状態を更新することもできます。
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); }
プロジェクトをビルドし、デバッグを開始します。 Visual Studio の実験用インスタンスが表示されます。
[ツール] メニューに Invoke ChangeMenuText という名前のコマンドが表示されます。
このコマンド クリックします。 MenuItemCallback が呼び出されたことを通知するメッセージ ボックスが表示されます。 このメッセージ ボックスを閉じると、[ツール] メニューにあるコマンドの名前が New Text になっていることがわかります。