Přidání seznamu naposledy použitých položek do podnabídky

Tento názorný postup vychází z ukázek v podnabídce Přidat do nabídky a ukazuje, jak přidat dynamický seznam do podnabídky. Dynamický seznam tvoří základ pro vytvoření seznamu naposledy použitých položek (MRU).

Seznam dynamických nabídek začíná zástupným symbolem v nabídce. Při každém zobrazení nabídky se integrované vývojové prostředí (IDE) sady Visual Studio zeptá balíčku VSPackage na všechny příkazy, které by se měly zobrazit na zástupné sadě. Dynamický seznam může nastat kdekoli v nabídce. Dynamické seznamy se ale obvykle ukládají a zobrazují samy na podnabídkách nebo v dolní části nabídek. Pomocí těchto vzorů návrhu povolíte dynamickému seznamu příkazů rozbalit a uzavřít kontrakt, aniž by to ovlivnilo umístění jiných příkazů v nabídce. V tomto názorném postupu se dynamický seznam MRU zobrazí v dolní části existující podnabídky oddělené od zbytku podnabídky řádkem.

Technicky vzato lze dynamický seznam použít také na panel nástrojů. Nedoporučujeme ale toto použití používat, protože panel nástrojů by měl zůstat beze změny, pokud uživatel neuskutečí konkrétní kroky ke změně.

Tento názorný postup vytvoří seznam MRU čtyř položek, které změní jejich pořadí pokaždé, když je vybrána jedna z nich (vybraná položka se přesune na začátek seznamu).

Další informace o nabídkách a souborech .vsct naleznete v tématu Příkazy, nabídky a panely nástrojů.

Požadavky

Pokud chcete postupovat podle tohoto návodu, musíte nainstalovat sadu Visual Studio SDK. Další informace najdete v sadě Visual Studio SDK.

Vytvoření rozšíření

Vytvoření příkazu dynamického seznamu položek

  1. Otevřete TestCommandPackage.vsct.

  2. Symbols V části v GuidSymbol uzlu s názvem guidTestCommandPackageCmdSet přidejte symbol pro MRUListGroup skupinu a cmdidMRUList příkaz následujícím způsobem.

    <IDSymbol name="MRUListGroup" value="0x1200"/>
    <IDSymbol name="cmdidMRUList" value="0x0200"/>
    
  3. Groups V části přidejte deklarovanou skupinu za existující položky skupiny.

    <Group guid="guidTestCommandPackageCmdSet" id="MRUListGroup"
            priority="0x0100">
        <Parent guid="guidTestCommandPackageCmdSet" id="SubMenu"/>
    </Group>
    
  4. Buttons V části přidejte uzel, který bude představovat nově deklarovaný příkaz za existující položky tlačítka.

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

    Příznak DynamicItemStart umožňuje dynamické generování příkazu.

  5. Sestavte projekt a spusťte ladění a otestujte zobrazení nového příkazu.

    V nabídce TestMenu klikněte na novou podnabídku, podnabídka, podnabídka, aby se zobrazil nový příkaz, zástupný symbol MRU. Po implementaci dynamického seznamu příkazů v dalším postupu se tento popisek příkazu nahradí tímto seznamem při každém otevření podnabídky.

Vyplnění seznamu MRU

  1. V souboru TestCommandPackageGuids.cs přidejte následující řádky za existující ID příkazů v TestCommandPackageGuids definici třídy.

    public const string guidTestCommandPackageCmdSet = "00000000-0000-0000-0000-00000000"; // get the GUID from the .vsct file
    public const uint cmdidMRUList = 0x200;
    
  2. Do souboru TestCommand.cs přidejte následující příkaz using.

    using System.Collections;
    
  3. Za poslední volání AddCommand přidejte do konstruktoru TestCommand následující kód. Tato hodnota bude definována InitMRUMenu později.

    this.InitMRUMenu(commandService);
    
  4. Do třídy TestCommand přidejte následující kód. Tento kód inicializuje seznam řetězců, které představují položky, které se mají zobrazit v seznamu MRU.

    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. Za metodu InitializeMRUList přidejte metodu InitMRUMenu . Tím se inicializují příkazy nabídky seznamu MRU.

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

    Je nutné vytvořit objekt příkazu nabídky pro všechny možné položky v seznamu MRU. Integrované vývojové prostředí volá metodu OnMRUQueryStatus pro každou položku v seznamu MRU, dokud nebudou k dispozici žádné další položky. Jediným způsobem, jak integrované vývojové prostředí (IDE) ve spravovaném kódu zjistit, že neexistují žádné další položky, je nejprve vytvořit všechny možné položky. Pokud chcete, můžete nejdřív označit další položky, které nejsou viditelné po mc.Visible = false; vytvoření příkazu nabídky. Tyto položky se pak dají později zobrazit pomocí mc.Visible = true;OnMRUQueryStatus metody.

  6. Za metodu InitMRUMenu přidejte následující OnMRUQueryStatus metodu. Toto je obslužná rutina, která nastavuje text pro každou položku MRU.

    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. Za metodu OnMRUQueryStatus přidejte následující OnMRUExec metodu. Toto je obslužná rutina pro výběr položky MRU. Tato metoda přesune vybranou položku na začátek seznamu a pak zobrazí vybranou položku v poli zprávy.

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

Testování seznamu MRU

  1. Sestavte projekt a spusťte ladění.

  2. V nabídce TestMenu klepněte na tlačítko Invoke TestCommand. Tím se zobrazí okno se zprávou, které indikuje, že byl příkaz vybrán.

    Poznámka:

    Tento krok je nutný k vynucení načtení balíčku VSPackage a správnému zobrazení seznamu MRU. Pokud tento krok přeskočíte, seznam MRU se nezobrazí.

  3. V nabídce Testovací nabídka klepněte na příkaz Pod nabídka. Seznam čtyř položek se zobrazí na konci podnabídky pod oddělovačem. Když kliknete na položku 3, mělo by se zobrazit pole se zprávou a zobrazit text Vybraná položka 3. (Pokud se nezobrazí seznam čtyř položek, ujistěte se, že jste postupovali podle pokynů v předchozím kroku.)

  4. Znovu otevřete podnabídku. Všimněte si, že položka 3 je nyní v horní části seznamu a ostatní položky byly posunuty o jednu pozici dolů. Znovu klikněte na položku 3 a všimněte si, že pole zprávy stále zobrazuje vybranou položku 3, což znamená, že text se správně přesunul na nové místo společně s popiskem příkazu.