Condividi tramite


Procedura: Aggiungere dinamicamente voci di menu

Un comando definito nel file Basato su XML di configurazione della Tabella al comando (.vsct) e ha il flag di DynamicItemStart specifica una posizione in un menu in cui i controlli creati dinamicamente vengono inseriti. I controlli dinamici vengono solitamente creati quando il package VS associato viene avviato e possono essere aggiornati quando il package VS è aperto.

Due tipi comuni di elenchi dinamici sono i seguenti:

  • Elenco (MRU) utilizzati di recente, che in genere vengono visualizzati i nomi dei documenti che sono stati aperti più di recente.

  • Le finestre elenco, che in genere vengono visualizzati i nomi di windows che sono attualmente aperti.

Il flag di DynamicItemStart in una definizione di comando specifica che il comando è un segnaposto fino a aprire il package VS. Quando il package VS è aperto, il segnaposto verrà sostituito con 0 o più controlli creati in fase di esecuzione dal package VS e aggiunti all'elenco dinamico. Non è possibile vedere la posizione in cui l'elenco dinamico viene visualizzato fino a aprire il package VS.

Per compilare l'elenco dinamico, le prime chiamate (IDE) dell'ambiente di sviluppo integrato il package VS per trovare un comando con un ID dei primi caratteri sono gli stessi ID segnaposto. Quando l'ide rileva un comando corrispondente, aggiungere il nome del comando all'elenco dinamico. Quindi l'ide incrementa l'ID e cerca un altro comando corrispondente aggiungere all'elenco dinamico. L'ide continua a incrementare l'ID e aggiungere all'elenco dinamico fino a quando non vi sono più controlli dinamici.

La prima procedura viene descritto come creare un elenco dinamico utilizzati di recente in un sottomenu.

La seconda procedura viene descritto come popolare un elenco dinamico utilizzando il pacchetto gestito Framework (MPF).

per ulteriori informazioni sui file di .vsct, vedere Tabella dei comandi di Visual Studio (. file di Vsct).

Per informazioni su come creare un elenco utilizzati di recente, vedere procedura dettagliata: Aggiunta di un elenco utilizzati di recente in un sottomenu.

creare un elenco di comando dinamico

Per creare un elenco di comando dinamico, è innanzitutto necessario aggiungere un elemento di pulsante nel file di .vsct. Questo elemento diventa un segnaposto per l'elenco nell'IDE. Quindi distribuire l'elenco stesso nel codice.

Per creare un segnaposto per un elenco di comando dinamico

  1. Nel file di .vsct, creare un sottomenu che contiene un gruppo di controlli. Per ulteriori informazioni, vedere Procedura: Creare i menu, i menu e i menu di scelta rapida.

    questo sottomenu conterrà l'elenco dinamico.

  2. Nella sezione di Symbols del file di .vsct, individuare l'elemento di GuidSymbol contenente gli altri controlli. Aggiungere un elemento di IDSymbol per il gruppo di MRUListGroup e il comando di cmdidMRUList per il segnaposto dinamico di elenco, ad esempio seguente.

  3. Definire un gruppo, come illustrato di seguito.

    <Group guid="guidTopLevelMenuCmdSet" id="MRUListGroup" priority="0x100">
      <Parent guid="guidTopLevelMenuCmdSet" id="SubMenu"/>
    </Group>
    
  4. Definire il nuovo comando come elemento di Button nella sezione di Buttons .

    1. Impostare guid e id sistema al GUID: coppia di ID che rappresenta il nuovo elemento. Il GUID: La coppia ID è costituito dai valori di name degli elementi di IDSymbol e di GuidSymbol del passaggio precedente.

      questo GUID: La coppia ID è la prima in un elenco dei controlli dinamici vengono aggiunti in fase di esecuzione dal package VS. Ogni comando dinamico successivo con un ID ovvero una maggiore dell'ID del comando dinamico precedente.

    2. Impostare l'attributo di type a pulsante.

      Un comando dinamico utilizza il pulsante del tipo come qualsiasi altro comando.

    3. Non impostare un attributo di priority per il comando.

      Questo sottomenu contiene solo un elenco dinamico. Di conseguenza, la priorità del primo elemento è ininfluente. Gli elementi dinamici aggiunti successivamente hanno la stessa priorità, l'ordine in cui ogni oggetto viene aggiunto indica la posizione relativa.

    4. Aggiungere un elemento di Elemento padre che ha guid e attributi di id che corrispondono a quelli del gruppo creato per il sottomenu.

    5. Aggiungere un elemento di Flag di comando e impostarne il valore su DynamicItemStart.

      Contrassegna il comando come segnaposto.

      Nota

      Tutti gli altri flag vengono ignorati.Se si desidera controllare la visibilità di un elemento dinamico, è necessario farlo dal package VS in fase di esecuzione.

    6. Aggiungere un elemento di stringhe contenente un elemento di ButtonText e un elemento di CommandName e imposta i valori al nome segnaposto.

      In genere, il testo del pulsante non viene visualizzato se il package VS possibile inizializzare elenco dinamico prima che il menu che lo contiene sia indicato.

    7. non specificare un elemento di icona .

      Un comando dinamico non può contenere un'icona associata.

    Nell'esempio seguente viene illustrata una definizione di comando completata per un segnaposto elenchi utilizzati di recente.

    <Button guid="guidTopLevelMenuCmdSet" id="cmdidMRUList"
            type="Button" priority="0x0100">
      <Parent guid="guidTopLevelMenuCmdSet" id="MRUListGroup" />
      <CommandFlag>DynamicItemStart</CommandFlag>
      <Strings>
        <CommandName>cmdidMRUList</CommandName>
        <ButtonText>MRU Placeholder</ButtonText>
      </Strings>
    </Button>
    

Per distribuire l'elenco dinamico

I gestori eventi gestiti di utilizzo (MPF) del Framework del pacchetto per nascondere i dettagli dell'interfaccia di IOleCommandTarget e del relativo metodo di QueryStatus . Per un package VS che viene scritta utilizzando il MPF per supportare un elenco dinamico dei comandi di menu, creare un elenco di oggetti di OleMenuCommand , ognuno dei quali rappresenta un elemento nell'elenco dinamico. Ogni oggetto di OleMenuCommand ha lo stesso gestore eventi per eseguire il comando e lo stesso gestore eventi per ottenere lo stato del comando.

Nota

Il codice dell'procedura riportata di seguito procedura dettagliata: Aggiunta di un elenco utilizzati di recente in un sottomenu per illustrare come implementare un elenco dinamico.tuttavia, il codice non crea un VSPackage completo.per un esempio completo, vedere la procedura dettagliata.

Per implementare un elenco dinamico

  1. Aggiungere l'ID all'elenco degli ID in PkgCmdID.cs.

    public const uint cmdidMRUList = 0x200;
    
  2. In TopLevelMenuPackage.cs aggiungere la seguente istruzione using.

    using System.Collections;
    
  3. Associa il segnaposto a un'istanza di OleMenuCommand e assegna i gestori eventi. Il metodo nell'esempio seguente viene chiamato dal metodo di Initialize() del pacchetto.

    private void InitMRUMenu(OleMenuCommandService mcs)
    {
        InitializeMRUList();
        for (int i = 0; i < this.numMRUItems; i++)
        {
            var cmdID = new CommandID(
                GuidList.guidTopLevelMenuCmdSet, this.baseMRUID + i);
            var mc = new OleMenuCommand(
                new EventHandler(OnMRUExec), cmdID);
            mc.BeforeQueryStatus += new EventHandler(OnMRUQueryStatus);
            mcs.AddCommand(mc);
        }
    }
    

    Negli esempi riportati in questa procedura si presuppone che le variabili private seguenti siano utilizzate.

    private int numMRUItems = 4;
    private int baseMRUID = (int)PkgCmdIDList.cmdidMRUList;
    private ArrayList mruList;
    
  4. Utilizzare il gestore eventi di QueryStatus per compilare l'elenco dinamico, come illustrato nell'esempio seguente.

    private void OnMRUQueryStatus(object sender, EventArgs e)
    {
        OleMenuCommand menuCommand = sender as OleMenuCommand;
        if (null != menuCommand)
        {
            int MRUItemIndex = menuCommand.CommandID.ID - this.baseMRUID;
            if (MRUItemIndex >= 0 && MRUItemIndex < this.mruList.Count)
            {
                menuCommand.Text = this.mruList[MRUItemIndex] as string;
            }
        }
    }
    
  5. Implementazione del gestore exec per rispondere quando un elemento dell'elenco viene fatto clic su. Nell'esempio seguente viene aggiornata la posizione degli elementi di elenco in modo che il più recente venga visualizzato all'inizio.

    private void OnMRUExec(object sender, EventArgs e)
    {
        var menuCommand = sender as OleMenuCommand;
        if (null != menuCommand)
        {
            int MRUItemIndex = menuCommand.CommandID.ID - this.baseMRUID;
            if (MRUItemIndex >= 0 && MRUItemIndex < this.mruList.Count)
            {
                string selection = this.mruList[MRUItemIndex] as string;
                for (int i = MRUItemIndex; i > 0; i--)
                {
                    this.mruList[i] = this.mruList[i - 1];
                }
                this.mruList[0] = selection;
                System.Windows.Forms.MessageBox.Show(
                    string.Format(CultureInfo.CurrentCulture,
                                  "Selected {0}", selection));
            }
        }
    }
    

    È anche possibile utilizzare la proprietà di Text o la proprietà di CommandID per identificare quali elemento viene selezionato e rispondere di conseguenza.

  6. Controllare la visibilità delle voci di menu dell'utente o del menu impostando la proprietà di Visible . Il codice riportato di seguito viene eseguito il rendering di un menu o una voce di menu invisibile.

    var menuCommand = sender as OleMenuCommand;
    menuCommand.Visible = false;
    

    Inserendo il codice precedente nel gestore di QueryStatus lo applica all'intero menu in quanto fornisce l'argomento di sender a tale gestore. Tuttavia, inserirla nel gestore exec influisce solo la sola voce di menu da effettuare.

Vedere anche

Concetti

Come Vspackage aggiunge gli elementi dell'interfaccia utente dell'IDE

Altre risorse

Controlli, menu e barre degli strumenti

Attività comuni con i controlli, i menu e le barre degli strumenti