Adicionar um controlador de menu a uma barra de ferramentas

Este passo a passo baseia-se no passo a passo Adicionar uma barra de ferramentas a uma janela de ferramentas e mostra como adicionar um controlador de menu à barra de ferramentas da janela de ferramentas. As etapas mostradas aqui também podem ser aplicadas à barra de ferramentas criada no passo a passo Adicionar uma barra de ferramentas .

Um controlador de menu é um controle dividido. O lado esquerdo do controlador de menu mostra o último comando usado e você pode executá-lo clicando nele. O lado direito do controlador de menu é uma seta que, quando clicada, abre uma lista de comandos adicionais. Quando você clica em um comando na lista, o comando é executado e substitui o comando no lado esquerdo do controlador de menu. Dessa forma, o controlador de menu funciona como um botão de comando que sempre mostra o último comando usado de uma lista.

Os controladores de menu podem aparecer nos menus, mas são mais frequentemente usados nas barras de ferramentas.

Criar um controlador de menu

  1. Siga os procedimentos descritos em Adicionar uma barra de ferramentas a uma janela de ferramenta para criar uma janela de ferramenta que tenha uma barra de ferramentas.

  2. Em TWTestCommandPackage.vsct, vá para a seção Símbolos. No elemento GuidSymbol chamado guidTWTestCommandPackageCmdSet, declare o controlador de menu, o grupo de controladores de menu e três itens de menu.

    <IDSymbol name="TestMenuController" value="0x1300" /><IDSymbol name="TestMenuControllerGroup" value="0x1060" /><IDSymbol name="cmdidMCItem1" value="0x0130" /><IDSymbol name="cmdidMCItem2" value="0x0131" /><IDSymbol name="cmdidMCItem3" value="0x0132" />
    
  3. Na seção Menus, após a última entrada de menu, defina o controlador de menu como um menu.

    <Menu guid="guidTWTestCommandPackageCmdSet" id="TestMenuController" priority="0x0100" type="MenuController">
        <Parent guid="guidTWTestCommandPackageCmdSet" id="TWToolbarGroup" />
        <CommandFlag>IconAndText</CommandFlag>
        <CommandFlag>TextChanges</CommandFlag>
        <CommandFlag>TextIsAnchorCommand</CommandFlag>
        <Strings>
            <ButtonText>Test Menu Controller</ButtonText>
            <CommandName>Test Menu Controller</CommandName>
        </Strings>
    </Menu>
    

    Os TextChanges sinalizadores e TextIsAnchorCommand devem ser incluídos para permitir que o controlador de menu reflita o último comando selecionado.

  4. Na seção Grupos, após a última entrada de grupo, adicione o grupo de controladores de menu.

    <Group guid="guidTWTestCommandPackageCmdSet" id="TestMenuControllerGroup" priority="0x000">
        <Parent guid="guidTWTestCommandPackageCmdSet" id="TestMenuController" />
    </Group>
    

    Ao definir o controlador de menu como pai, todos os comandos colocados nesse grupo aparecem no controlador de menu. O priority atributo é omitido, o que o define como o valor padrão de 0, porque é o único grupo no controlador de menu.

  5. Na seção Botões, após a última entrada de botão, adicione um elemento Button para cada um dos itens de menu.

    <Button guid="guidTWTestCommandPackageCmdSet" id="cmdidMCItem1" priority="0x0000" type="Button">
        <Parent guid="guidTWTestCommandPackageCmdSet" id="TestMenuControllerGroup" />
        <Icon guid="guidImages" id="bmpPic1" />
        <CommandFlag>IconAndText</CommandFlag>
        <Strings>
            <ButtonText>MC Item 1</ButtonText>
            <CommandName>MC Item 1</CommandName>
        </Strings>
    </Button>
    <Button guid="guidTWTestCommandPackageCmdSet" id="cmdidMCItem2" priority="0x0100" type="Button">
        <Parent guid="guidTWTestCommandPackageCmdSet" id="TestMenuControllerGroup" />
        <Icon guid="guidImages" id="bmpPic2" />
        <CommandFlag>IconAndText</CommandFlag>
        <Strings>
            <ButtonText>MC Item 2</ButtonText>
            <CommandName>MC Item 2</CommandName>
        </Strings>
    </Button>
    <Button guid="guidTWTestCommandPackageCmdSet" id="cmdidMCItem3" priority="0x0200" type="Button">
        <Parent guid="guidTWTestCommandPackageCmdSet" id="TestMenuControllerGroup" />
        <Icon guid="guidImages" id="bmpPicSearch" />
        <CommandFlag>IconAndText</CommandFlag>
        <Strings>
            <ButtonText>MC Item 3</ButtonText>
            <CommandName>MC Item 3</CommandName>
        </Strings>
    </Button>
    
  6. Neste ponto, você pode olhar para o controlador de menu. Compile o projeto e comece a depuração. Você deve ver a instância experimental.

    1. No menu Exibir / Outro Windows, abra Test ToolWindow.

    2. O controlador de menu aparece na barra de ferramentas na janela da ferramenta.

    3. Clique na seta no lado direito do controlador de menu para ver os três comandos possíveis.

      Observe que quando você clica em um comando, o título do controlador de menu é alterado para exibir esse comando. Na próxima seção, adicionaremos o código para ativar esses comandos.

Implementar os comandos do controlador de menu

  1. Em TWTestCommandPackageGuids.cs, adicione IDs de comando para seus três itens de menu após os IDs de comando existentes.

    public const int cmdidMCItem1 = 0x130;
    public const int cmdidMCItem2 = 0x131;
    public const int cmdidMCItem3 = 0x132;
    
  2. Em TWTestCommand.cs, adicione o seguinte código na parte superior da TWTestCommand classe.

    private int currentMCCommand; // The currently selected menu controller command
    
  3. No construtor TWTestCommand, após a última chamada para o AddCommand método, adicione código para rotear os eventos de cada comando por meio dos mesmos manipuladores.

    for (int i = TWTestCommandPackageGuids.cmdidMCItem1; i <=
        TWTestCommandPackageGuids.cmdidMCItem3; i++)
    {
        CommandID cmdID = new
        CommandID(new Guid(TWTestCommandPackageGuids.guidTWTestCommandPackageCmdSet), i);
        OleMenuCommand mc = new OleMenuCommand(new
          EventHandler(OnMCItemClicked), cmdID);
        mc.BeforeQueryStatus += new EventHandler(OnMCItemQueryStatus);
        commandService.AddCommand(mc);
        // The first item is, by default, checked. 
        if (TWTestCommandPackageGuids.cmdidMCItem1 == i)
        {
            mc.Checked = true;
            this.currentMCCommand = i;
        }
    }
    
  4. Adicione um manipulador de eventos à classe TWTestCommand para marcar o comando selecionado como marcado.

    private void OnMCItemQueryStatus(object sender, EventArgs e)
    {
        OleMenuCommand mc = sender as OleMenuCommand;
        if (null != mc)
        {
            mc.Checked = (mc.CommandID.ID == this.currentMCCommand);
        }
    }
    
  5. Adicione um manipulador de eventos que exibe um MessageBox quando o usuário seleciona um comando no controlador de menu:

    private void OnMCItemClicked(object sender, EventArgs e)
    {
        OleMenuCommand mc = sender as OleMenuCommand;
        if (null != mc)
        {
            string selection;
            switch (mc.CommandID.ID)
            {
                case c.cmdidMCItem1:
                    selection = "Menu controller Item 1";
                    break;
    
                case TWTestCommandPackageGuids.cmdidMCItem2:
                    selection = "Menu controller Item 2";
                    break;
    
                case TWTestCommandPackageGuids.cmdidMCItem3:
                    selection = "Menu controller Item 3";
                    break;
    
                default:
                    selection = "Unknown command";
                    break;
            }
            this.currentMCCommand = mc.CommandID.ID;
    
            IVsUIShell uiShell =
              (IVsUIShell) ServiceProvider.GetService(typeof(SVsUIShell));
            Guid clsid = Guid.Empty;
            int result;
            uiShell.ShowMessageBox(
                    0,
                    ref clsid,
                    "Test Tool Window Toolbar Package",
                    string.Format(CultureInfo.CurrentCulture,
                                 "You selected {0}", selection),
                    string.Empty,
                    0,
                    OLEMSGBUTTON.OLEMSGBUTTON_OK,
                    OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST,
                    OLEMSGICON.OLEMSGICON_INFO,
                    0,
                    out result);
        }
    }
    

Testando o controlador de menu

  1. Compile o projeto e comece a depuração. Você deve ver a instância experimental.

  2. Abra a janela de ferramentas de teste no menu Exibir / Outro Windows.

    O controlador de menu aparece na barra de ferramentas na janela de ferramentas e exibe MC Item 1.

  3. Clique no botão do controlador de menu à esquerda da seta.

    Você deve ver três itens, o primeiro dos quais está selecionado e tem uma caixa de realce ao redor de seu ícone. Clique em MC Item 3.

    Uma caixa de diálogo é exibida com a mensagem Você selecionou Item 3 do controlador de menu. Observe que a mensagem corresponde ao texto no botão do controlador de menu. O botão do controlador de menu agora exibe MC Item 3.