Freigeben über


Gewusst wie: Fügen Sie dynamisch Menüelemente hinzu

Ein Befehl, der in der Befehls-Tabellen-Konfiguration XML-basierter (.vsct) definiert und das Flag hat DynamicItemStart gibt eine Position in einem Menü angezeigt, in der dynamisch erstellte Befehle eingefügt werden. Dynamische Befehle werden in der Regel erstellt, wenn die zugeordnete VSPackage gestartet wird und können aktualisiert werden, wenn ein VSPackage geöffnet ist.

Es gibt zwei allgemeine Arten von dynamischen Liste lauten wie folgt:

  • Abschließend verwendet MRU (Liste), die i. d. R. die Namen von Dokumenten angezeigt werden, die vor kurzem geöffnet wurden.

  • Fenster übergeben, das normalerweise die Namen von Fenstern angezeigt werden, die gerade geöffnet sind.

Das DynamicItemStart-Flag für eine Befehlsdefinition gibt an, dass der Befehl ein Platzhalter ist, bis ein VSPackage geöffnet ist. Wenn ein VSPackage geöffnet ist, wird der Platzhalter durch 0 ersetzt oder mehr Befehle, die zur Laufzeit von einem VSPackage erstellt und zur dynamischen Liste hinzugefügt. Sie sind möglicherweise nicht in der Lage, die Position im Menü angezeigt, in der die dynamische Liste angezeigt wird, bis ein VSPackage geöffnet ist.

Um die dynamische Liste auffüllen, die ersten Rufe der integrierten Entwicklungsumgebung (IDE) VSPackage, um nach einem Befehl zu suchen, der eine ID enthält, deren erste Zeichen wie die ID des Platzhalters handelt. Wenn die IDE einen entsprechenden Befehl findet, der den Namen des Befehls des dynamischen Liste hinzu. Anschließend inkrementiert die IDE die ID und sucht nach einem anderen entsprechenden Befehl, der dynamischen Liste hinzuzufügen. Die IDE unterstützt weiterhin die ID zu inkrementieren und einer dynamischen Liste hinzugefügt werden soll, bis keine weiteren dynamische Befehle vorhanden ist.

Im ersten Verfahren wird beschrieben, wie eine dynamische MRU-Liste in einem Untermenü erstellt.

Im zweiten Verfahren wird beschrieben, wie eine dynamische Liste aufgefüllt wird, indem das verwaltete Paketframework (MPF) verwendet.

Weitere Informationen zu .vsct-Dateien finden Sie unter (Visual Studio-Befehls-Tabelle. Dateien Vsct).

Informationen dazu, wie eine MRU-Liste finden Sie unter Exemplarische Vorgehensweise: Eine Liste zuletzt verwendeter zu einem Untermenü hinzuerstellt.

Eine dynamische Befehls-Liste erstellen

Um eine dynamische Liste Befehle zu erstellen, müssen Sie ein Schaltfläche-Element in der ersten .vsct-Datei hinzufügen. Dieses Element ist ein Platzhalter für die Liste in der IDE. Implementieren Sie dann die Liste auch im Code.

So fügen Sie einen Platzhalter für eine dynamische Liste Befehle erstellen

  1. In der .vsct-Datei erstellen Sie ein Untermenü, das eine Befehlsgruppe enthält. Weitere Informationen finden Sie unter Gewusst wie: Erstellen von Menüs, Untermenüs und Kontextmenüs.

    Das Untermenü enthält die dynamische Liste.

  2. Im Symbols-Abschnitt der .vsct-Datei, suchen Sie das GuidSymbol-Element, das die andere Befehle enthält. Fügen Sie ein IDSymbol-Element für die MRUListGroup Gruppe und den cmdidMRUList Befehl für den Platzhalter des dynamischen Liste wie folgt hinzu.

  3. Definieren einer Gruppe, wie folgt aus.

    <Group guid="guidTopLevelMenuCmdSet" id="MRUListGroup" priority="0x100">
      <Parent guid="guidTopLevelMenuCmdSet" id="SubMenu"/>
    </Group>
    
  4. Definieren Sie den neuen Befehl als Button-Element im Abschnitt Buttons .

    1. Legen Sie die guid und id Felder in den GUID fest: ID-Paar, das das neue Element darstellt. Die GUID: ID-Paar besteht aus den name-Werten der GuidSymbol und IDSymbol-Elemente aus dem vorherigen Schritt.

      Dieses GUID: ID-Paar ist das erste in einer dynamischen Liste von Befehlen, die zur Laufzeit von einem VSPackage hinzugefügt werden. Jeder folgende dynamische Befehl verfügt über eine ID, die eine größer ist als die ID des vorherigen dynamischen Befehls.

    2. Legen Sie das Attribut auf Schaltflächetype fest.

      Ein dynamischer Befehl verfügt die Schaltfläche Typ wie jeder andere Befehl.

    3. Legen Sie kein priority-Attribut für den Befehl fest.

      Das Untermenü enthält nur eine dynamische Liste. Daher ist die Priorität des ersten Zeitraums keine Rolle. Dynamische Elemente, die später hinzugefügt werden, weisen die gleiche Priorität. Die Reihenfolge, in der jede hinzugefügte zeigt ihre relative Position vor.

    4. Fügen Sie ein Das übergeordnete Element-Element hinzu, das guid und id-Attribute verfügt, die der Gruppe übereinstimmen, die für das Untermenü erstellt wurde.

    5. Fügen Sie ein Befehls-Flag-Element hinzu, und legen Sie seinen Wert auf DynamicItemStartfest.

      Dies kennzeichnet den Befehl als Platzhalter.

      Hinweis

      Alle anderen Flags werden ignoriert.Wenn Sie die Sichtbarkeit eines dynamischen Elements steuern möchten, müssen Sie dies aus einem VSPackage zur Laufzeit.

    6. Fügen Sie ein Zeichenfolgen-Element hinzu, das ein ButtonText-Element und ein CommandName-Element enthält und deren Werte auf den Namen des Platzhalters festzulegen.

      In der Regel wird dieser Schaltflächentext nicht angezeigt, wenn ein VSPackage die dynamische Liste initialisieren kann, bevor das Menü, das sie angezeigt wird.

    7. Geben Sie kein Symbol-Element an.

      Ein dynamischer Befehl kann kein Symbol zugeordnet ist.

    Das folgende Beispiel zeigt eine vollständige MRU-Listen-Platzhalter für einen Befehlsdefinition an.

    <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>
    

Die dynamische Liste implementieren

Das verwaltete Paketframework (MPF) - Ereignishandler verwendet, um die Details der IOleCommandTarget-Schnittstelle und ihre QueryStatus-Methode auszublenden. Bei einem VSPackage, die geschrieben wird, indem das MPF verwendet, um eine dynamische Liste von Menübefehlen zu unterstützen, erstellen Sie eine Liste von OleMenuCommand-Objekten, von denen jedes ein Element in der dynamischen Liste darstellt. Jedes OleMenuCommand-Objekt verfügt über denselben Ereignishandler für das Ausführen des Befehls und denselben Ereignishandler für das Abrufen des Status des Befehls.

Hinweis

In der folgenden Prozedur wird mithilfe von Code Exemplarische Vorgehensweise: Eine Liste zuletzt verwendeter zu einem Untermenü hinzu , um zu veranschaulichen, wie eine dynamische Liste implementiert.Allerdings erstellt der Code nicht vollständig VSPackage.Ein vollständiges Beispiel finden Sie in der exemplarischen Vorgehensweise.

So implementieren Sie eine dynamische Liste

  1. Fügen Sie die ID der in PkgCmdID.cs Liste von IDs hinzu.

    public const uint cmdidMRUList = 0x200;
    
  2. In TopLevelMenuPackage.cs fügen Sie dies mithilfe der Anweisung hinzu.

    using System.Collections;
    
  3. Binden Sie den Platzhalter mit einer OleMenuCommand-Instanz, und weisen Sie seine Ereignishandler zu. Die Methode im folgenden Beispiel werden aus der Initialize()-Methode des Pakets aufgerufen.

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

    Die Beispiele in dieser Prozedur wird davon ausgegangen, dass die folgenden privaten Variablen verwendet werden.

    private int numMRUItems = 4;
    private int baseMRUID = (int)PkgCmdIDList.cmdidMRUList;
    private ArrayList mruList;
    
  4. Verwenden Sie den QueryStatus-Ereignishandler, um die dynamische Liste wie im folgenden Beispiel gezeigt aufzufüllen.

    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. Implementieren Sie den Leitprogramm Handler, um zu reagieren, wenn auf ein Element in der Liste geklickt wird. Das folgende Beispiel aktualisiert die Position der Listenelemente, damit das neueste oben angezeigt wird.

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

    Sie können die Text-Eigenschaft oder die CommandID-Eigenschaft auch verwenden, um zu bestimmen, welches Element ausgewählt ist, und entsprechend reagieren.

  6. Steuern der Sichtbarkeit der Menü- oder einzelne menüelemente, indem Sie die Visible-Eigenschaft festlegen. Der folgende Code stellt ein Menü oder ein Menüelement nicht sichtbar.

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

    Die vorangehenden Code in den QueryStatus-Handler eingeben, wird es an das gesamte Menü, da das sender-Argument in diesem Handler bereitstellt. Allerdings wirkt sich das Sie sie in den Leitprogramm Klassenhandler Menüelement, das das einzelne gerade ausgeführt wird.

Siehe auch

Konzepte

Wie VSPackages Benutzeroberflächenelemente Hinzufügen der IDE

Weitere Ressourcen

Befehle, Menüs und Symbolleisten

Allgemeine Aufgaben mit Befehlen, Menüs und Symbolleisten