Freigeben über


Hinzufügen einer zuletzt verwendeten Liste zu einem Untermenü

Diese exemplarische Vorgehensweise baut auf den Demonstrationen in "Hinzufügen eines Untermenüs zu einem Menü" auf und zeigt, wie Sie einem Untermenü eine dynamische Liste hinzufügen. Die dynamische Liste bildet die Grundlage für die Erstellung einer Liste der zuletzt verwendeten Listen (Most Recently Used, MRU).

Eine dynamische Menüliste beginnt mit einem Platzhalter in einem Menü. Jedes Mal, wenn das Menü angezeigt wird, fordert die integrierte Entwicklungsumgebung (Integrated Development Environment, IDE) von Visual Studio die VSPackage für alle Befehle an, die am Platzhalter angezeigt werden sollen. Eine dynamische Liste kann überall in einem Menü auftreten. Dynamische Listen werden jedoch in der Regel in Untermenüs oder unten in Menüs gespeichert und angezeigt. Mithilfe dieser Entwurfsmuster können Sie die dynamische Liste der Befehle erweitern und kontraktieren, ohne die Position anderer Befehle im Menü zu beeinträchtigen. In dieser exemplarischen Vorgehensweise wird die dynamische MRU-Liste am unteren Rand eines vorhandenen Untermenüs angezeigt, getrennt vom Rest des Untermenüs durch eine Zeile.

Technisch kann eine dynamische Liste auch auf eine Symbolleiste angewendet werden. Es wird jedoch davon abgeraten, diese Verwendung zu verwenden, da eine Symbolleiste nicht geändert werden sollte Standard es sei denn, der Benutzer führt bestimmte Schritte aus, um sie zu ändern.

In dieser exemplarischen Vorgehensweise wird eine MRU-Liste mit vier Elementen erstellt, die ihre Reihenfolge bei jeder Auswahl ändern (das ausgewählte Element wird an den Anfang der Liste verschoben).

Weitere Informationen zu Menüs und VSCT-Dateien finden Sie unter Befehle, Menüs und Symbolleisten.

Voraussetzungen

Um dieser exemplarischen Vorgehensweise folgen zu können, müssen Sie das Visual Studio SDK installieren. Weitere Informationen finden Sie unter Visual Studio SDK.

Erstellen einer Erweiterung

  • Befolgen Sie die Verfahren zum Hinzufügen eines Untermenüs zu einem Menü , um das Untermenü zu erstellen, das in den folgenden Verfahren geändert wird.

    Bei den Verfahren in dieser exemplarischen Vorgehensweise wird davon ausgegangen, dass der Name des VSPackage-Elements der Name ist TestCommand, der in der Menüleiste von Visual Studio verwendet wird.

Erstellen eines Befehls für dynamische Elementlisten

  1. Öffnen Sie TestCommandPackage.vsct.

  2. Fügen Sie im Symbols Abschnitt im GuidSymbol Knoten "guidTestCommandPackageCmdSet" das Symbol für die MRUListGroup Gruppe und den cmdidMRUList Befehl wie folgt hinzu.

    <IDSymbol name="MRUListGroup" value="0x1200"/>
    <IDSymbol name="cmdidMRUList" value="0x0200"/>
    
  3. Fügen Sie im Groups Abschnitt die deklarierte Gruppe nach den vorhandenen Gruppeneinträgen hinzu.

    <Group guid="guidTestCommandPackageCmdSet" id="MRUListGroup"
            priority="0x0100">
        <Parent guid="guidTestCommandPackageCmdSet" id="SubMenu"/>
    </Group>
    
  4. Fügen Sie im Buttons Abschnitt einen Knoten hinzu, der den neu deklarierten Befehl nach den vorhandenen Schaltflächeneinträgen darstellt.

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

    Mit DynamicItemStart dem Flag kann der Befehl dynamisch generiert werden.

  5. Erstellen Sie das Projekt, und starten Sie das Debuggen, um die Anzeige des neuen Befehls zu testen.

    Klicken Sie im Menü "TestMenü " auf das neue Untermenü " Untermenü", um den neuen Befehl MRU-Platzhalter anzuzeigen. Nachdem eine dynamische MRU-Liste von Befehlen im nächsten Verfahren implementiert wurde, wird diese Befehlsbezeichnung bei jedem Öffnen des Untermenüs durch diese Liste ersetzt.

Ausfüllen der MRU-Liste

  1. Fügen Sie in TestCommandPackageGuids.cs die folgenden Zeilen nach den vorhandenen Befehls-IDs in der TestCommandPackageGuids Klassendefinition hinzu.

    public const string guidTestCommandPackageCmdSet = "00000000-0000-0000-0000-00000000"; // get the GUID from the .vsct file
    public const uint cmdidMRUList = 0x200;
    
  2. Fügen Sie in TestCommand.cs die folgende using-Anweisung hinzu.

    using System.Collections;
    
  3. Fügen Sie nach dem letzten AddCommand-Aufruf den folgenden Code im TestCommand-Konstruktor hinzu. Der InitMRUMenu Vorgang wird später definiert.

    this.InitMRUMenu(commandService);
    
  4. Fügen Sie den folgenden Code in der TestCommand-Klasse hinzu. Dieser Code initialisiert die Liste der Zeichenfolgen, die die Elemente darstellen, die in der MRU-Liste angezeigt werden sollen.

    private int numMRUItems = 4;
    private int baseMRUID = (int)TestCommandPackageGuids.cmdidMRUList;
    private ArrayList mruList;
    
    private void InitializeMRUList()
    {
        if (null == this.mruList)
        {
            this.mruList = new ArrayList();
            if (null != this.mruList)
            {
                for (int i = 0; i < this.numMRUItems; i++)
                {
                    this.mruList.Add(string.Format(CultureInfo.CurrentCulture,
                        "Item {0}", i + 1));
                }
            }
        }
    }
    
  5. Fügen Sie nach der InitializeMRUList Methode die InitMRUMenu Methode hinzu. Dadurch werden die Menübefehle im MRU-Listenmenü initialisiert.

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

    Sie müssen für jedes mögliche Element in der MRU-Liste ein Menübefehlsobjekt erstellen. Die IDE ruft die OnMRUQueryStatus Methode für jedes Element in der MRU-Liste auf, bis keine weiteren Elemente vorhanden sind. Im verwalteten Code ist die einzige Möglichkeit für die IDE zu wissen, dass nicht mehr Elemente vorhanden sind, um zuerst alle möglichen Elemente zu erstellen. Wenn Sie möchten, können Sie zusätzliche Elemente zuerst als nicht sichtbar markieren, indem mc.Visible = false; Sie nach dem Erstellen des Menübefehls verwenden. Diese Elemente können später mithilfe mc.Visible = true; der OnMRUQueryStatus Methode sichtbar gemacht werden.

  6. Fügen Sie nach der InitMRUMenu Methode die folgende OnMRUQueryStatus Methode hinzu. Dies ist der Handler, der den Text für jedes MRU-Element festlegt.

    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;
            }
        }
    }
    
  7. Fügen Sie nach der OnMRUQueryStatus Methode die folgende OnMRUExec Methode hinzu. Dies ist der Handler für die Auswahl eines MRU-Elements. Diese Methode verschiebt das ausgewählte Element an den Anfang der Liste und zeigt dann das ausgewählte Element in einem Meldungsfeld an.

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

Testen der MRU-Liste

  1. Erstellen Sie das Projekt, und starten Sie das Debugging.

  2. Klicken Sie im Menü "TestMenü " auf "TestCommand aufrufen". Dadurch wird ein Meldungsfeld angezeigt, das angibt, dass der Befehl ausgewählt wurde.

    Hinweis

    Dieser Schritt ist erforderlich, um zu erzwingen, dass vsPackage die MRU-Liste lädt und ordnungsgemäß anzeigt. Wenn Sie diesen Schritt überspringen, wird die MRU-Liste nicht angezeigt.

  3. Klicken Sie im Menü "Test" auf "Untermenü". Eine Liste mit vier Elementen wird am Ende des Untermenüs unterhalb eines Trennzeichens angezeigt. Wenn Sie auf Element 3 klicken, sollte ein Meldungsfeld angezeigt und der Text "Ausgewähltes Element 3" angezeigt werden. (Wenn die Liste mit vier Elementen nicht angezeigt wird, stellen Sie sicher, dass Sie die Anweisungen im vorherigen Schritt befolgt haben.)

  4. Öffnen Sie das Untermenü erneut. Beachten Sie, dass sich Element 3 jetzt am Anfang der Liste befindet und die anderen Elemente an einer Position nach unten verschoben wurden. Klicken Sie erneut auf Element 3, und beachten Sie, dass das Meldungsfeld weiterhin ausgewähltes Element 3 anzeigt, was angibt, dass der Text ordnungsgemäß an die neue Position zusammen mit der Befehlsbeschriftung verschoben wurde.