Добавление контекстного меню в окне инструментов
В этом пошаговом руководстве контекстное меню помещается в окно инструментов. Контекстное меню — это меню, которое отображается, когда пользователь щелкает правой кнопкой мыши кнопку, текстовое поле или фон окна. Команды в контекстном меню ведут себя так же, как команды в других меню или панели инструментов. Чтобы поддерживать контекстное меню, укажите его в VSCT-файле и отобразите его в ответ на щелчк мыши правой кнопкой мыши.
Окно инструментов состоит из пользовательского элемента управления WPF в пользовательском классе окна инструментов, наследуемом от ToolWindowPane.
В этом пошаговом руководстве показано, как создать контекстное меню в виде меню Visual Studio, объявив элементы меню в VSCT-файле, а затем с помощью управляемой платформы пакетов для реализации их в классе, определяющем окно инструментов. Этот подход упрощает доступ к командам Visual Studio, элементам пользовательского интерфейса и объектной модели автоматизации.
Кроме того, если контекстное меню не будет получать доступ к функциям Visual Studio, можно использовать ContextMenu свойство элемента XAML в пользовательском элементе управления. Дополнительные сведения см. в разделе ContextMenu.
Создание пакета контекстного меню окна средства
- Создайте проект VSIX с именем
TWShortcutMenu
и добавьте в него шаблон окна инструментов с именем ShortcutMenu . Дополнительные сведения о создании окна инструментов см. в статье "Создание расширения с помощью окна инструментов".
Указание контекстного меню
Контекстное меню, например в этом пошаговом руководстве, позволяет пользователю выбрать из списка цветов, которые используются для заполнения фона окна инструмента.
В Контекстном меню.vsct найдите элемент GuidSymbol с именем guidShortcutMenuPackageCmdSet и объявите контекстное меню, группу контекстного меню и параметры меню. Теперь элемент GuidSymbol должен выглядеть следующим образом:
<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>
Перед элементом Button создайте элемент Menus и определите контекстное меню в нем.
<Menus> <Menu guid="guidShortcutMenuPackageCmdSet" id="ColorMenu" type="Context"> <Strings> <ButtonText>Color change</ButtonText> <CommandName>ColorChange</CommandName> </Strings> </Menu> </Menus>
Контекстное меню не имеет родительского элемента, так как оно не является частью меню или панели инструментов.
Создайте элемент Groups с элементом Group, содержащим контекстные пункты меню, и свяжите группу с контекстным меню.
<Groups> <Group guid="guidShortcutMenuPackageCmdSet" id="ColorGroup"> <Parent guid="guidShortcutMenuPackageCmdSet" id="ColorMenu"/> </Group> </Groups>
В элементе Button определите отдельные команды, которые будут отображаться в контекстном меню. Элемент Button должен выглядеть следующим образом:
<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>
В контекстном файле ShortcutMenuCommand.cs добавьте определения для GUID набора команд, контекстного меню и элементов меню.
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;
Это те же идентификаторы команд, которые определены в разделе "Символы" файла ShortcutMenuPackage.vsct . Группа контекстов не включена здесь, так как она требуется только в VSCT-файле .
Реализация контекстного меню
В этом разделе реализовано контекстное меню и его команды.
В ЯрлыкМену.cs окно инструментов может получить службу команд меню, но элемент управления, содержащий его, не может. Ниже показано, как сделать командную службу меню доступной для пользовательского элемента управления.
В ShortcutMenu.cs добавьте следующие директивы using:
using Microsoft.VisualStudio.Shell; using System.ComponentModel.Design;
Переопределите метод Initialize() окна средства, чтобы получить службу команд меню и добавить элемент управления, передав командную службу меню конструктору:
protected override void Initialize() { var commandService = (OleMenuCommandService)GetService(typeof(IMenuCommandService)); Content = new ShortcutMenuControl(commandService); }
В конструкторе окна инструментов ShortcutMenu удалите строку, которая добавляет элемент управления. Конструктор должен выглядеть следующим образом:
public ShortcutMenu() : base(null) { this.Caption = "ShortcutMenu"; this.BitmapResourceID = 301; this.BitmapIndex = 1; }
В контекстном файле ShortcutMenuControl.xaml.cs добавьте частное поле для командной службы меню и измените конструктор элемента управления, чтобы принять службу команд меню. Затем используйте службу команд меню, чтобы добавить команды контекстного меню. Конструктор ShortcutMenuControl должен выглядеть следующим образом. Обработчик команд будет определен позже.
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)); } }
В Файле ShortcutMenuControl.xaml добавьте MouseRightButtonDown событие в элемент верхнего уровня UserControl . Теперь XAML-файл должен выглядеть следующим образом:
<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>
В ShortcutMenuControl.xaml.cs добавьте заглушку для обработчика событий.
private void MyToolWindow_MouseRightButtonDown(object sender, MouseButtonEventArgs e) { . . . }
Добавьте следующие директивы using в тот же файл:
using Microsoft.VisualStudio.Shell; using System.ComponentModel.Design; using System; using System.Windows.Input; using System.Windows.Media;
MyToolWindowMouseRightButtonDown
Реализуйте событие следующим образом.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); } }
Это создает CommandID объект контекстного меню, определяет расположение щелчка мыши и открывает контекстное меню в этом расположении ShowContextMenu с помощью метода.
Реализуйте обработчик команд.
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; } }
В этом случае только один метод обрабатывает события для всех элементов меню, определяя и устанавливая CommandID цвет фона соответствующим образом. Если элементы меню содержали несвязанные команды, вы создали бы отдельный обработчик событий для каждой команды.
Проверка возможностей окна инструментов
Выполните сборку решения и запустите отладку. Откроется экспериментальный экземпляр.
В экспериментальном экземпляре нажмите кнопку "Вид/ Другие окна", а затем нажмите кнопку "ЯрлыкМеню". Это должно отобразить окно средства.
Щелкните правой кнопкой мыши текст окна инструментов. Контекстное меню со списком цветов должно отображаться.
Щелкните цвет в контекстном меню. Цвет фона окна инструментов должен быть изменен на выбранный цвет.