Dodawanie menu skrótów w oknie narzędzi
Ten przewodnik umieszcza menu skrótów w oknie narzędzi. Menu skrótów to menu, które jest wyświetlane, gdy użytkownik kliknie prawym przyciskiem myszy przycisk, pole tekstowe lub tło okna. Polecenia w menu skrótów zachowują się tak samo jak polecenia w innych menu lub paskach narzędzi. Aby obsługiwać menu skrótów, określ go w pliku vsct i wyświetl go w odpowiedzi na kliknięcie prawym przyciskiem myszy.
Okno narzędzia składa się z kontrolki użytkownika WPF w niestandardowej klasie okien narzędzi, która dziedziczy z ToolWindowPaneklasy .
W tym przewodniku pokazano, jak utworzyć menu skrótów jako menu programu Visual Studio, deklarując elementy menu w pliku vsct , a następnie za pomocą programu Managed Package Framework zaimplementować je w klasie definiującej okno narzędzia. Takie podejście ułatwia dostęp do poleceń programu Visual Studio, elementów interfejsu użytkownika i modelu obiektów usługi Automation.
Alternatywnie, jeśli menu skrótów nie będzie uzyskiwać dostępu do funkcji programu Visual Studio, możesz użyć ContextMenu właściwości elementu XAML w kontrolce użytkownika. Aby uzyskać więcej informacji, zobacz ContextMenu.
Tworzenie pakietu menu skrótów okna narzędzi
- Utwórz projekt VSIX o nazwie
TWShortcutMenu
i dodaj do niego szablon okna narzędzi o nazwie ShortcutMenu . Aby uzyskać więcej informacji na temat tworzenia okna narzędzi, zobacz Tworzenie rozszerzenia za pomocą okna narzędzi.
Określanie menu skrótów
Menu skrótów, takie jak pokazane w tym przewodniku, umożliwia użytkownikowi wybranie z listy kolorów używanych do wypełnienia tła okna narzędzia.
W pliku ShortcutMenuPackage.vsct znajdź element GuidSymbol o nazwie guidShortcutMenuPackageCmdSet i zadeklaruj menu skrótów, grupę menu skrótów i opcje menu. Element GuidSymbol powinien teraz wyglądać następująco:
<GuidSymbol name="guidShortcutMenuPackageCmdSet" value="{00000000-0000-0000-0000-0000}"> // your GUID here <IDSymbol name="ShortcutMenuCommandId" value="0x0100" /> <IDSymbol name="ColorMenu" value="0x1000"/> <IDSymbol name="ColorGroup" value="0x1100"/> <IDSymbol name="cmdidRed" value="0x102"/> <IDSymbol name="cmdidYellow" value="0x103"/> <IDSymbol name="cmdidBlue" value="0x104"/> </GuidSymbol>
Tuż przed elementem Przyciski utwórz element Menus, a następnie zdefiniuj w nim menu skrótów.
<Menus> <Menu guid="guidShortcutMenuPackageCmdSet" id="ColorMenu" type="Context"> <Strings> <ButtonText>Color change</ButtonText> <CommandName>ColorChange</CommandName> </Strings> </Menu> </Menus>
Menu skrótów nie ma elementu nadrzędnego, ponieważ nie jest częścią menu ani paska narzędzi.
Utwórz element Grupy za pomocą elementu Grupa, który zawiera elementy menu skrótów i skojarz grupę z menu skrótów.
<Groups> <Group guid="guidShortcutMenuPackageCmdSet" id="ColorGroup"> <Parent guid="guidShortcutMenuPackageCmdSet" id="ColorMenu"/> </Group> </Groups>
W elemecie Przyciski zdefiniuj poszczególne polecenia, które będą wyświetlane w menu skrótów. Element Przyciski powinien wyglądać następująco:
<Buttons> <Button guid="guidShortcutMenuPackageCmdSet" id="ShortcutMenuCommandId" priority="0x0100" type="Button"> <Parent guid="guidSHLMainMenu" id="IDG_VS_WNDO_OTRWNDWS1"/> <Icon guid="guidImages" id="bmpPic1" /> <Strings> <ButtonText>ShortcutMenu</ButtonText> </Strings> </Button> <Button guid="guidShortcutMenuPackageCmdSet" id="cmdidRed" priority="1" type="Button"> <Parent guid="guidShortcutMenuPackageCmdSet" id="ColorGroup" /> <Strings> <ButtonText>Red</ButtonText> </Strings> </Button> <Button guid="guidShortcutMenuPackageCmdSet" id="cmdidYellow" priority="3" type="Button"> <Parent guid="guidShortcutMenuPackageCmdSet" id="ColorGroup" /> <Strings> <ButtonText>Yellow</ButtonText> </Strings> </Button> <Button guid="guidShortcutMenuPackageCmdSet" id="cmdidBlue" priority="5" type="Button"> <Parent guid="guidShortcutMenuPackageCmdSet" id="ColorGroup" /> <Strings> <ButtonText>Blue</ButtonText> </Strings> </Button> </Buttons>
W pliku ShortcutMenuCommand.cs dodaj definicje dla identyfikatora GUID zestawu poleceń, menu skrótów i elementów menu.
public const string guidShortcutMenuPackageCmdSet = "00000000-0000-0000-0000-00000000"; // your GUID will differ public const int ColorMenu = 0x1000; public const int cmdidRed = 0x102; public const int cmdidYellow = 0x103; public const int cmdidBlue = 0x104;
Są to te same identyfikatory poleceń, które są zdefiniowane w sekcji Symbole pliku ShortcutMenuPackage.vsct . Grupa kontekstowa nie jest tutaj dołączona, ponieważ jest wymagana tylko w pliku vsct .
Implementowanie menu skrótów
Ta sekcja implementuje menu skrótów i jego polecenia.
W pliku ShortcutMenu.cs okno narzędzia może pobrać usługę poleceń menu, ale kontrolka, której zawiera, nie może. W poniższych krokach pokazano, jak udostępnić usługę poleceń menu dla kontrolki użytkownika.
W pliku ShortcutMenu.cs dodaj następujące dyrektywy using:
using Microsoft.VisualStudio.Shell; using System.ComponentModel.Design;
Zastąpij metodę Initialize() okna narzędzi, aby pobrać usługę poleceń menu i dodać kontrolkę, przekazując usługę poleceń menu do konstruktora:
protected override void Initialize() { var commandService = (OleMenuCommandService)GetService(typeof(IMenuCommandService)); Content = new ShortcutMenuControl(commandService); }
W konstruktorze okna narzędzia ShortcutMenu usuń wiersz, który dodaje kontrolkę. Konstruktor powinien teraz wyglądać następująco:
public ShortcutMenu() : base(null) { this.Caption = "ShortcutMenu"; this.BitmapResourceID = 301; this.BitmapIndex = 1; }
W pliku ShortcutMenuControl.xaml.cs dodaj pole prywatne dla usługi poleceń menu i zmień konstruktor sterowania, aby podjąć usługę poleceń menu. Następnie użyj usługi poleceń menu, aby dodać polecenia menu kontekstowego. Konstruktor ShortcutMenuControl powinien teraz wyglądać podobnie do poniższego kodu. Procedura obsługi poleceń zostanie zdefiniowana później.
public ShortcutMenuControl(OleMenuCommandService service) { this.InitializeComponent(); commandService = service; if (null !=commandService) { // Create an alias for the command set guid. Guid guid = new Guid(ShortcutMenuCommand.guidShortcutMenuPackageCmdSet); // Create the command IDs. var red = new CommandID(guid, ShortcutMenuCommand.cmdidRed); var yellow = new CommandID(guid, ShortcutMenuCommand.cmdidYellow); var blue = new CommandID(guid, ShortcutMenuCommand.cmdidBlue); // Add a command for each command ID. commandService.AddCommand(new MenuCommand(ChangeColor, red)); commandService.AddCommand(new MenuCommand(ChangeColor, yellow)); commandService.AddCommand(new MenuCommand(ChangeColor, blue)); } }
W pliku ShortcutMenuControl.xaml dodaj MouseRightButtonDown zdarzenie do elementu najwyższego poziomu UserControl . Plik XAML powinien teraz wyglądać następująco:
<UserControl x:Class="TWShortcutMenu.ShortcutMenuControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" Background="{DynamicResource VsBrush.Window}" Foreground="{DynamicResource VsBrush.WindowText}" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300" Name="MyToolWindow" MouseRightButtonDown="MyToolWindow_MouseRightButtonDown"> <Grid> <StackPanel Orientation="Vertical"> <TextBlock Margin="10" HorizontalAlignment="Center">ShortcutMenu</TextBlock> </StackPanel> </Grid> </UserControl>
W pliku ShortcutMenuControl.xaml.cs dodaj wycinkę procedury obsługi zdarzeń.
private void MyToolWindow_MouseRightButtonDown(object sender, MouseButtonEventArgs e) { . . . }
Dodaj następujące dyrektywy using do tego samego pliku:
using Microsoft.VisualStudio.Shell; using System.ComponentModel.Design; using System; using System.Windows.Input; using System.Windows.Media;
Zaimplementuj
MyToolWindowMouseRightButtonDown
zdarzenie w następujący sposób.private void MyToolWindow_MouseRightButtonDown(object sender, MouseButtonEventArgs e) { if (null != commandService) { CommandID menuID = new CommandID( new Guid(ShortcutMenuCommand.guidShortcutMenuPackageCmdSet), ShortcutMenuCommand.ColorMenu); Point p = this.PointToScreen(e.GetPosition(this)); commandService.ShowContextMenu(menuID, (int)p.X, (int)p.Y); } }
Spowoduje to utworzenie CommandID obiektu dla menu skrótów, zidentyfikowanie lokalizacji kliknięcia myszy i otwarcie menu skrótów w tej lokalizacji przy użyciu ShowContextMenu metody .
Zaimplementuj program obsługi poleceń.
private void ChangeColor(object sender, EventArgs e) { var mc = sender as MenuCommand; switch (mc.CommandID.ID) { case ShortcutMenuCommand.cmdidRed: MyToolWindow.Background = Brushes.Red; break; case ShortcutMenuCommand.cmdidYellow: MyToolWindow.Background = Brushes.Yellow; break; case ShortcutMenuCommand.cmdidBlue: MyToolWindow.Background = Brushes.Blue; break; } }
W takim przypadku tylko jedna metoda obsługuje zdarzenia dla wszystkich elementów menu, identyfikując CommandID i ustawiając odpowiednio kolor tła. Gdyby elementy menu zawierały niepowiązane polecenia, utworzylibyśmy osobną procedurę obsługi zdarzeń dla każdego polecenia.
Testowanie funkcji okna narzędzi
Skompiluj projekt i rozpocznij debugowanie. Zostanie wyświetlone wystąpienie eksperymentalne.
W wystąpieniu eksperymentalnym kliknij pozycję Wyświetl/ Inny system Windows, a następnie kliknij pozycję SkrótMenu. W tym celu powinno zostać wyświetlone okno narzędzia.
Kliknij prawym przyciskiem myszy treść okna narzędzia. Powinno zostać wyświetlone menu skrótów z listą kolorów.
Kliknij kolor w menu skrótów. Kolor tła okna narzędzi należy zmienić na wybrany kolor.