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í
Postupujte podle pokynů v části Přidání podnabídky do nabídky a vytvořte podnabídku upravenou v následujících postupech.
Postupy v tomto názorném postupu předpokládají, že název balíčku VSPackage je
TestCommand
, což je název, který se používá v nabídce Přidat do řádku nabídek sady Visual Studio.
Vytvoření příkazu dynamického seznamu položek
Otevřete TestCommandPackage.vsct.
Symbols
V části vGuidSymbol
uzlu s názvem guidTestCommandPackageCmdSet přidejte symbol proMRUListGroup
skupinu acmdidMRUList
příkaz následujícím způsobem.<IDSymbol name="MRUListGroup" value="0x1200"/> <IDSymbol name="cmdidMRUList" value="0x0200"/>
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>
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.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
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;
Do souboru TestCommand.cs přidejte následující příkaz using.
using System.Collections;
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);
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)); } } } }
Za metodu
InitializeMRUList
přidejte metoduInitMRUMenu
. 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é pomc.Visible = false;
vytvoření příkazu nabídky. Tyto položky se pak dají později zobrazit pomocímc.Visible = true;
OnMRUQueryStatus
metody.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; } } }
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
Sestavte projekt a spusťte ladění.
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í.
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.)
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.