Přidání místní nabídky v okně nástroje
Tento názorný postup vloží místní nabídku do okna nástroje. Místní nabídka je nabídka, která se zobrazí, když uživatel klikne pravým tlačítkem myši na tlačítko, textové pole nebo pozadí okna. Příkazy v místní nabídce se chovají stejně jako příkazy v jiných nabídkách nebo panelech nástrojů. Pokud chcete podporu místní nabídky, zadejte ji v souboru .vsct a zobrazte ji v reakci na kliknutí pravým tlačítkem myši.
Okno nástroje se skládá z uživatelského ovládacího prvku WPF ve vlastní třídě okna nástrojů, která dědí z ToolWindowPane.
Tento návod ukazuje, jak vytvořit místní nabídku jako nabídku sady Visual Studio deklarováním položek nabídky v souboru .vsct a následným použitím rozhraní Managed Package Framework je implementovat ve třídě, která definuje okno nástroje. Tento přístup usnadňuje přístup k příkazům sady Visual Studio, prvkům uživatelského rozhraní a modelu objektů Automation.
Pokud místní nabídka nebude mít přístup k funkcím sady Visual Studio, můžete použít ContextMenu vlastnost elementu XAML v uživatelském ovládacím prvku. Další informace naleznete v tématu ContextMenu.
Vytvoření balíčku místní nabídky okna nástroje
- Vytvořte projekt VSIX s názvem
TWShortcutMenu
a přidejte do něj šablonu okna nástroje s názvem ShortcutMenu . Další informace o vytvoření okna nástroje najdete v tématu Vytvoření rozšíření s oknem nástroje.
Zadání místní nabídky
Místní nabídka, jako je například nabídka zobrazená v tomto názorném postupu, umožňuje uživateli vybrat ze seznamu barev, které slouží k vyplnění pozadí okna nástroje.
V ShortcutMenuPackage.vsct vyhledejte v elementu GuidSymbol s názvem guidShortcutMenuPackageCmdSet a deklarujte místní nabídku, skupinu místních nabídek a možnosti nabídky. Element GuidSymbol by teď měl vypadat takto:
<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>
Těsně před elementem Buttons vytvořte element Menus a pak v něm definujte místní nabídku.
<Menus> <Menu guid="guidShortcutMenuPackageCmdSet" id="ColorMenu" type="Context"> <Strings> <ButtonText>Color change</ButtonText> <CommandName>ColorChange</CommandName> </Strings> </Menu> </Menus>
Místní nabídka nemá nadřazenou položku, protože není součástí nabídky nebo panelu nástrojů.
Vytvořte element Groups s elementem Group, který obsahuje položky místní nabídky, a přidružte skupinu k místní nabídce.
<Groups> <Group guid="guidShortcutMenuPackageCmdSet" id="ColorGroup"> <Parent guid="guidShortcutMenuPackageCmdSet" id="ColorMenu"/> </Group> </Groups>
V elementu Buttons definujte jednotlivé příkazy, které se zobrazí v místní nabídce. Element Buttons by měl vypadat takto:
<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>
V souboru ShortcutMenuCommand.cs přidejte definice pro identifikátor GUID sady příkazů, místní nabídku a položky nabídky.
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;
Jedná se o stejné ID příkazů, které jsou definovány v části Symboly souboru ShortcutMenuPackage.vsct . Kontextová skupina zde není zahrnuta, protože je vyžadována pouze v souboru .vsct .
Implementace místní nabídky
Tato část implementuje místní nabídku a její příkazy.
V souboru ShortcutMenu.cs může okno nástroje získat příkazovou službu nabídky, ale ovládací prvek, který obsahuje, nemůže. Následující kroky ukazují, jak zpřístupnit službu příkazů nabídky pro uživatelský ovládací prvek.
V souboru ShortcutMenu.cs přidejte následující direktivy using:
using Microsoft.VisualStudio.Shell; using System.ComponentModel.Design;
Přepište metodu Initialize() okna nástroje, abyste získali příkazovou službu nabídky a přidali ovládací prvek a předali příkazovou službu nabídky konstruktoru:
protected override void Initialize() { var commandService = (OleMenuCommandService)GetService(typeof(IMenuCommandService)); Content = new ShortcutMenuControl(commandService); }
V konstruktoru okna nástroje ShortcutMenu odeberte řádek, který ovládací prvek přidá. Konstruktor by teď měl vypadat takto:
public ShortcutMenu() : base(null) { this.Caption = "ShortcutMenu"; this.BitmapResourceID = 301; this.BitmapIndex = 1; }
V souboru ShortcutMenuControl.xaml.cs přidejte privátní pole pro službu příkazů nabídky a změňte konstruktor ovládacího prvku tak, aby převzal příkazovou službu nabídky. Pak pomocí služby příkazů nabídky přidejte příkazy místní nabídky. Konstruktor ShortcutMenuControl by teď měl vypadat jako následující kód. Obslužná rutina příkazu bude definována později.
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)); } }
V Souboru ShortcutMenuControl.xaml přidejte MouseRightButtonDown událost do elementu nejvyšší úrovně UserControl . Soubor XAML by teď měl vypadat takto:
<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>
V souboru ShortcutMenuControl.xaml.cs přidejte zástupnou proceduru obslužné rutiny události.
private void MyToolWindow_MouseRightButtonDown(object sender, MouseButtonEventArgs e) { . . . }
Do stejného souboru přidejte následující direktivy using:
using Microsoft.VisualStudio.Shell; using System.ComponentModel.Design; using System; using System.Windows.Input; using System.Windows.Media;
MyToolWindowMouseRightButtonDown
Implementujte událost následujícím způsobem.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); } }
Tím se CommandID vytvoří objekt pro místní nabídku, identifikuje umístění kliknutí myší a otevře místní nabídku v tomto umístění pomocí ShowContextMenu metody.
Implementujte obslužnou rutinu příkazu.
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; } }
V tomto případě pouze jedna metoda zpracovává události pro všechny položky nabídky určením CommandID a nastavením barvy pozadí odpovídajícím způsobem. Pokud položky nabídky obsahovaly nesouvisející příkazy, vytvořili byste pro každý příkaz samostatnou obslužnou rutinu události.
Testování funkcí okna nástrojů
Sestavte projekt a spusťte ladění. Zobrazí se experimentální instance.
V experimentální instanci klepněte na tlačítko Zobrazit / Jiné Windows a potom klepněte na tlačítko ShortcutMenu. Tím by se mělo zobrazit okno nástroje.
Klikněte pravým tlačítkem myši do textu okna nástroje. Měla by se zobrazit místní nabídka se seznamem barev.
V místní nabídce klikněte na barvu. Barva pozadí okna nástroje by se měla změnit na vybranou barvu.