Alterar o texto de um comando de menu

As etapas a seguir mostram como alterar o rótulo de texto de um comando de menu usando o IMenuCommandService serviço.

Alterando um rótulo de comando de menu com o IMenuCommandService

  1. Crie um projeto VSIX nomeado MenuText com um comando de menu chamado ChangeMenuText. Para obter mais informações, consulte Criar uma extensão com um comando de menu.

  2. No arquivo .vsct, adicione o TextChanges sinalizador ao comando de menu, conforme mostrado no exemplo a seguir.

    <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. No arquivo ChangeMenuText.cs crie um manipulador de eventos que será chamado antes que o comando de menu seja exibido.

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

    Você também pode atualizar o status do comando de menu nesse método alterando as Visiblepropriedades , Checkede Enabled no OleMenuCommand objeto.

  4. No construtor ChangeMenuText, substitua o código de inicialização e posicionamento do comando original pelo código que cria um (em vez de um OleMenuCommandMenuCommand) que representa o comando menu, adiciona o manipulador de eventos e fornece o BeforeQueryStatus comando menu ao serviço de comando menu.

    Aqui está como deve ser:

    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. Compile o projeto e comece a depuração. A instância experimental do Visual Studio aparece.

  6. No menu Ferramentas, você verá um comando chamado Invoke ChangeMenuText.

  7. Clique no comando. Você verá a caixa de mensagem anunciando que MenuItemCallback foi chamado. Quando você descarta a caixa de mensagem, você deve ver que o nome do comando no menu Ferramentas agora é Novo texto.