更改菜单命令的文本
以下步骤演示如何使用 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"; } }
还可以通过更改Visible对象上的和CheckedEnabled属性OleMenuCommand来更新此方法中菜单命令的状态。
在 ChangeMenuText 构造函数中,将原始命令初始化和放置代码替换为用于创建 OleMenuCommand 表示菜单命令的代码、
MenuCommand
添加 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 。 关闭消息框时,应会看到“工具”菜单上的命令名称现在 为“新建文本”。