更改菜单命令的文本

以下步骤演示如何使用 IMenuCommandService 服务更改菜单命令的文本标签。

使用 IMenuCommandService 更改菜单命令标签

  1. 创建一个名为 ChangeMenuText 的菜单命令命名MenuTextVSIX 项目。 有关详细信息,请参阅 使用菜单命令创建扩展。

  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";
        }
    }
    

    还可以通过更改Visible对象上的和CheckedEnabled属性OleMenuCommand来更新此方法中菜单命令的状态。

  4. 在 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);
    }
    
  5. 生成项目并启动调试。 此时会显示 Visual Studio 的实验实例。

  6. “工具” 菜单上,应会看到名为 Invoke ChangeMenuText 的命令。

  7. 单击该命令。 应会看到消息框, 宣布已调用 MenuItemCallback 。 关闭消息框时,应会看到“工具”菜单上的命令名称现在 为“新建文本”。