Добавление подменю в меню
В этом пошаговом руководстве показано , как добавить меню в строку меню Visual Studio, чтобы добавить подменю в меню TestMenu .
Подменю — это дополнительное меню, которое отображается в другом меню. Подменю можно определить со стрелкой, которая следует за его именем. Нажатие имени приводит к отображению подменю и его команд.
Это пошаговое руководство создает подменю в меню в строке меню Visual Studio и помещает новую команду в подменю. Пошаговое руководство также реализует новую команду.
Добавление подменю в меню
Выполните действия, описанные в разделе "Добавление меню" в строку меню Visual Studio, чтобы создать проект и пункт меню. В этом пошаговом руководстве предполагается, что имя проекта VSIX .
TopLevelMenu
Откройте TestCommandPackage.vsct.
<Symbols>
В разделе добавьте<IDSymbol>
элемент для подменю, один для группы подменю и один для команды, все в<GuidSymbol>
узле с именем GUIDTopLevelMenuCmdSet. Это тот же узел, который содержит<IDSymbol>
элемент для меню верхнего уровня.<IDSymbol name="SubMenu" value="0x1100"/> <IDSymbol name="SubMenuGroup" value="0x1150"/> <IDSymbol name="cmdidTestSubCommand" value="0x0105"/>
Добавьте в раздел только что созданный подменю
<Menus>
.<Menu guid="guidTestCommandPackageCmdSet" id="SubMenu" priority="0x0100" type="Menu"> <Parent guid="guidTestCommandPackageCmdSet" id="MyMenuGroup"/> <Strings> <ButtonText>Sub Menu</ButtonText> <CommandName>Sub Menu</CommandName> </Strings> </Menu>
Пара GUID/ID родительского элемента указывает группу меню, созданную в строке меню Visual Studio, и является дочерним элементом меню верхнего уровня.
Добавьте группу меню, определенную на шаге 2, в
<Groups>
раздел и сделайте ее дочерним элементом подменю.<Group guid="guidTestCommandPackageCmdSet" id="SubMenuGroup" priority="0x0000"> <Parent guid="guidTestCommandPackageCmdSet" id="SubMenu"/> </Group>
Добавьте новый
<Button>
элемент в<Buttons>
раздел, чтобы определить команду, созданную на шаге 2 в качестве элемента в подменю.<Button guid="guidTestCommandPackageCmdSet" id="cmdidTestSubCommand" priority="0x0000" type="Button"> <Parent guid="guidTestCommandPackageCmdSet" id="SubMenuGroup" /> <Icon guid="guidImages" id="bmpPic2" /> <Strings> <CommandName>cmdidTestSubCommand</CommandName> <ButtonText>Test Sub Command</ButtonText> </Strings> </Button>
Создайте решение и начните отладку. Вы увидите экспериментальный экземпляр.
Щелкните TestMenu, чтобы увидеть новое подменю с именем Sub Menu. Щелкните меню "Подменю ", чтобы открыть подменю и увидеть новую команду, тестовую подменю. Обратите внимание, что нажатие кнопки "Тестовая команда" ничего не делает.
Добавление команды
Откройте TestCommand.cs и добавьте следующий идентификатор команды после существующего идентификатора команды.
public const int cmdidTestSubCmd = 0x0105;
Добавьте вложенную команду. Найдите конструктор команд. Добавьте следующие строки сразу после вызова
AddCommand
метода.CommandID subCommandID = new CommandID(CommandSet, cmdidTestSubCmd); MenuCommand subItem = new MenuCommand(new EventHandler(SubItemCallback), subCommandID); commandService.AddCommand(subItem);
Обработчик
SubItemCallback
команд будет определен позже. Конструктор должен выглядеть следующим образом:private TestCommand(Package package) { if (package == null) { throw new ArgumentNullException("package"); } this.package = package; OleMenuCommandService commandService = this.ServiceProvider.GetService(typeof(IMenuCommandService)) as OleMenuCommandService; if (commandService != null) { var menuCommandID = new CommandID(CommandSet, CommandId); var menuItem = new MenuCommand(this.MenuItemCallback, menuCommandID); commandService.AddCommand(menuItem); CommandID subCommandID = new CommandID(CommandSet, cmdidTestSubCmd); MenuCommand subItem = new MenuCommand(new EventHandler(SubItemCallback), subCommandID); commandService.AddCommand(subItem); } }
Добавьте
SubItemCallback()
. Это метод, который вызывается при щелчке новой команды в подменю.private void SubItemCallback(object sender, EventArgs e) { ThreadHelper.ThrowIfNotOnUIThread(); IVsUIShell uiShell = this.package.GetService<SVsUIShell, IVsUIShell>(); Guid clsid = Guid.Empty; int result; uiShell.ShowMessageBox( 0, ref clsid, "TestCommand", string.Format(CultureInfo.CurrentCulture, "Inside TestCommand.SubItemCallback()", this.ToString()), string.Empty, 0, OLEMSGBUTTON.OLEMSGBUTTON_OK, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST, OLEMSGICON.OLEMSGICON_INFO, 0, out result); }
Выполните сборку решения и запустите отладку. Должен появиться экспериментальный экземпляр.
В меню TestMenu щелкните вложенное меню и выберите команду Test Sub Command. Появится поле сообщения и отобразится текст "Test Command Inside TestCommand.SubItemCallback()".