Dodawanie ostatnio używanej listy do podmenu
Ten przewodnik opiera się na demonstracjach w temacie Dodawanie podmenu do menu i pokazuje, jak dodać listę dynamiczną do podmenu. Lista dynamiczna stanowi podstawę tworzenia listy ostatnio używanych (MRU).
Lista menu dynamicznego rozpoczyna się od symbolu zastępczego w menu. Za każdym razem, gdy menu jest wyświetlane, zintegrowane środowisko projektowe programu Visual Studio (IDE) pyta pakiet VSPackage o wszystkie polecenia, które powinny być wyświetlane w symbolu zastępczym. Lista dynamiczna może występować w dowolnym miejscu w menu. Jednak listy dynamiczne są zwykle przechowywane i wyświetlane samodzielnie w podmenu lub u dołu menu. Korzystając z tych wzorców projektowych, można włączyć dynamiczną listę poleceń, aby rozwinąć i zakontraktować bez wpływu na położenie innych poleceń w menu. W tym przewodniku dynamiczna lista MRU jest wyświetlana w dolnej części istniejącego podmenu oddzielona od pozostałej części podmenu przez wiersz.
Technicznie można również zastosować listę dynamiczną do paska narzędzi. Zniechęcimy jednak do tego użycia, ponieważ pasek narzędzi powinien pozostać niezmieniony, chyba że użytkownik podejmie określone kroki w celu jego zmiany.
Ten przewodnik tworzy listę mrU czterech elementów, które zmieniają kolejność za każdym razem, gdy wybrano jeden z nich (wybrany element przechodzi do góry listy).
Aby uzyskać więcej informacji na temat menu i plików vsct , zobacz Polecenia, menu i paski narzędzi.
Wymagania wstępne
Aby wykonać czynności opisane w tym przewodniku, należy zainstalować zestaw Visual Studio SDK. Aby uzyskać więcej informacji, zobacz Visual Studio SDK.
Tworzenie rozszerzenia
Postępuj zgodnie z procedurami w temacie Dodawanie podmenu do menu , aby utworzyć podmenu, który został zmodyfikowany w poniższych procedurach.
W procedurach w tym przewodniku przyjęto założenie, że nazwa pakietu VSPackage to
TestCommand
, czyli nazwa używana w menu Dodaj menu na pasku menu programu Visual Studio.
Tworzenie dynamicznego polecenia listy elementów
Otwórz plik TestCommandPackage.vsct.
Symbols
W sekcji w węźleGuidSymbol
o nazwie guidTestCommandPackageCmdSet dodaj symbol grupyMRUListGroup
icmdidMRUList
polecenia w następujący sposób.<IDSymbol name="MRUListGroup" value="0x1200"/> <IDSymbol name="cmdidMRUList" value="0x0200"/>
Groups
W sekcji dodaj zadeklarowaną grupę po istniejących wpisach grupy.<Group guid="guidTestCommandPackageCmdSet" id="MRUListGroup" priority="0x0100"> <Parent guid="guidTestCommandPackageCmdSet" id="SubMenu"/> </Group>
Buttons
W sekcji dodaj węzeł reprezentujący nowo zadeklarowane polecenie po istniejących wpisach przycisku.<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>
Flaga
DynamicItemStart
umożliwia dynamiczne generowanie polecenia.Skompiluj projekt i rozpocznij debugowanie, aby przetestować wyświetlanie nowego polecenia.
W menu TestMenu kliknij nowy podmenu, Podmenu, aby wyświetlić nowe polecenie, symbol zastępczy MRU. Po zaimplementowaniu dynamicznej listy poleceń MRU w następnej procedurze ta etykieta polecenia zostanie zastąpiona tą listą za każdym razem, gdy podmenu zostanie otwarty.
Wypełnianie listy jednostek MRU
W pliku TestCommandPackageGuids.cs dodaj następujące wiersze po istniejących identyfikatorach poleceń w
TestCommandPackageGuids
definicji klasy.public const string guidTestCommandPackageCmdSet = "00000000-0000-0000-0000-00000000"; // get the GUID from the .vsct file public const uint cmdidMRUList = 0x200;
W pliku TestCommand.cs dodaj następującą instrukcję using.
using System.Collections;
Dodaj następujący kod w konstruktorze TestCommand po ostatnim wywołaniu AddCommand. Element
InitMRUMenu
zostanie zdefiniowany późniejthis.InitMRUMenu(commandService);
Dodaj następujący kod w klasie TestCommand. Ten kod inicjuje listę ciągów reprezentujących elementy, które mają być wyświetlane na liście 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)); } } } }
Po metodzie
InitializeMRUList
dodaj metodęInitMRUMenu
. Spowoduje to zainicjowanie poleceń menu listy narzędzi 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); } }
Należy utworzyć obiekt polecenia menu dla każdego możliwego elementu na liście MRU. Środowisko IDE wywołuje metodę
OnMRUQueryStatus
dla każdego elementu na liście MRU, dopóki nie ma więcej elementów. W kodzie zarządzanym jedynym sposobem, aby środowisko IDE wiedziało, że nie ma więcej elementów, jest najpierw utworzenie wszystkich możliwych elementów. Jeśli chcesz, możesz oznaczyć dodatkowe elementy jako niewidoczne na początku, używając poleceniamc.Visible = false;
menu po utworzeniu polecenia menu. Te elementy można następnie uwidocznić później przy użyciumc.Visible = true;
metodyOnMRUQueryStatus
.Po metodzie
InitMRUMenu
dodaj następującąOnMRUQueryStatus
metodę. Jest to procedura obsługi, która ustawia tekst dla każdego elementu 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; } } }
Po metodzie
OnMRUQueryStatus
dodaj następującąOnMRUExec
metodę. Jest to procedura obsługi wybierania elementu MRU. Ta metoda przenosi wybrany element na górę listy, a następnie wyświetla wybrany element w polu komunikatu.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)); } } }
Testowanie listy narzędzi MRU
Skompiluj projekt i rozpocznij debugowanie.
W menu TestMenu kliknij pozycję Wywołaj testPolecenia. Spowoduje to wyświetlenie pola komunikatu wskazującego, że polecenie zostało wybrane.
Uwaga
Ten krok jest wymagany, aby wymusić załadowanie pakietu VSPackage i poprawne wyświetlenie listy MRU. Jeśli pominiesz ten krok, lista MRU nie zostanie wyświetlona.
W menu Menu testowe kliknij pozycję Menu podrzędne. Lista czterech elementów jest wyświetlana na końcu podmenu poniżej separatora. Po kliknięciu pozycji Element 3 powinno zostać wyświetlone pole komunikatu i wyświetlić tekst Wybrany element 3. (Jeśli lista czterech elementów nie jest wyświetlana, upewnij się, że zostały spełnione instrukcje w poprzednim kroku).
Otwórz ponownie podmenu. Zwróć uwagę, że element 3 znajduje się teraz w górnej części listy, a pozostałe elementy zostały wypchnięte w dół o jedną pozycję. Ponownie kliknij pozycję Element 3 i zwróć uwagę, że w polu komunikatu nadal jest wyświetlany element Wybrany 3, co oznacza, że tekst został poprawnie przeniesiony do nowej pozycji wraz z etykietą polecenia.