Aggiungere un controller di menu a una barra degli strumenti

Questa procedura dettagliata si basa sulla procedura dettagliata Aggiungere una barra degli strumenti a una finestra degli strumenti e illustra come aggiungere un controller di menu alla barra degli strumenti della finestra degli strumenti. I passaggi illustrati qui possono essere applicati anche alla barra degli strumenti creata nella procedura dettagliata Aggiungi una barra degli strumenti .

Un controller di menu è un controllo diviso. Il lato sinistro del controller di menu mostra l'ultimo comando usato ed è possibile eseguirlo facendo clic su di esso. Il lato destro del controller di menu è una freccia che, quando si fa clic, apre un elenco di comandi aggiuntivi. Quando si fa clic su un comando nell'elenco, il comando viene eseguito e sostituisce il comando a sinistra del controller di menu. In questo modo, il controller di menu funziona come un pulsante di comando che mostra sempre l'ultimo comando usato da un elenco.

I controller di menu possono essere visualizzati nei menu, ma vengono usati più spesso sulle barre degli strumenti.

Creare un controller di menu

  1. Seguire le procedure descritte in Aggiungere una barra degli strumenti a una finestra degli strumenti per creare una finestra degli strumenti con una barra degli strumenti.

  2. In TWTestCommandPackage.vsct passare alla sezione Simboli. Nell'elemento GuidSymbol denominato guidTWTestCommandPackageCmdSet dichiarare il controller di menu, il gruppo di controller di menu e tre voci di 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. Nella sezione Menu, dopo l'ultima voce di menu, definire il controller di menu come 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>
    

    I TextChanges flag e TextIsAnchorCommand devono essere inclusi per consentire al controller di menu di riflettere l'ultimo comando selezionato.

  4. Nella sezione Gruppi, dopo l'ultima voce di gruppo, aggiungere il gruppo di controller di menu.

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

    Impostando il controller di menu come padre, tutti i comandi inseriti in questo gruppo vengono visualizzati nel controller di menu. L'attributo priority viene omesso, che lo imposta sul valore predefinito 0, perché è l'unico gruppo nel controller di menu.

  5. Nella sezione Pulsanti, dopo l'ultima voce del pulsante, aggiungere un elemento Button per ognuna delle voci di 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. A questo punto, è possibile esaminare il controller di menu. Compilare il progetto e avviare il debug. Verrà visualizzata l'istanza sperimentale.

    1. Nel menu Visualizza/Altre finestre aprire Strumento di testWindow.

    2. Il controller di menu viene visualizzato sulla barra degli strumenti nella finestra degli strumenti.

    3. Fare clic sulla freccia sul lato destro del controller di menu per visualizzare i tre comandi possibili.

      Si noti che quando si fa clic su un comando, il titolo del controller di menu cambia per visualizzare tale comando. Nella sezione successiva verrà aggiunto il codice per attivare questi comandi.

Implementare i comandi del controller di menu

  1. In TWTestCommandPackageGuids.cs aggiungere gli ID comando per le tre voci di menu dopo gli ID dei comandi esistenti.

    public const int cmdidMCItem1 = 0x130;
    public const int cmdidMCItem2 = 0x131;
    public const int cmdidMCItem3 = 0x132;
    
  2. In TWTestCommand.cs aggiungere il codice seguente all'inizio della TWTestCommand classe.

    private int currentMCCommand; // The currently selected menu controller command
    
  3. Nel costruttore TWTestCommand, dopo l'ultima chiamata al AddCommand metodo, aggiungere il codice per instradare gli eventi per ogni comando tramite gli stessi gestori.

    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. Aggiungere un gestore eventi alla classe TWTestCommand per contrassegnare il comando selezionato come selezionato.

    private void OnMCItemQueryStatus(object sender, EventArgs e)
    {
        OleMenuCommand mc = sender as OleMenuCommand;
        if (null != mc)
        {
            mc.Checked = (mc.CommandID.ID == this.currentMCCommand);
        }
    }
    
  5. Aggiungere un gestore eventi che visualizza un MessageBox quando l'utente seleziona un comando nel controller di 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);
        }
    }
    

Test del controller di menu

  1. Compilare il progetto e avviare il debug. Verrà visualizzata l'istanza sperimentale.

  2. Aprire lo strumento di testWindow nel menu Visualizza/Altre finestre .

    Il controller di menu viene visualizzato nella barra degli strumenti nella finestra degli strumenti e visualizza MC Item 1.

  3. Fare clic sul pulsante del controller di menu a sinistra della freccia.

    Dovrebbero essere visualizzati tre elementi, il primo dei quali è selezionato e ha una casella di evidenziazione intorno alla relativa icona. Fare clic su MC Item 3.

    Viene visualizzata una finestra di dialogo con il messaggio Voce del controller di menu selezionata 3. Si noti che il messaggio corrisponde al testo nel pulsante del controller di menu. Il pulsante del controller di menu ora visualizza MC Item 3.