Поделиться через


Добавление подменю в меню

В этом пошаговом руководстве показано , как добавить меню в строку меню Visual Studio, чтобы добавить подменю в меню TestMenu .

Подменю — это дополнительное меню, которое отображается в другом меню. Подменю можно определить со стрелкой, которая следует за его именем. Нажатие имени приводит к отображению подменю и его команд.

Это пошаговое руководство создает подменю в меню в строке меню Visual Studio и помещает новую команду в подменю. Пошаговое руководство также реализует новую команду.

Добавление подменю в меню

  1. Выполните действия, описанные в разделе "Добавление меню" в строку меню Visual Studio, чтобы создать проект и пункт меню. В этом пошаговом руководстве предполагается, что имя проекта VSIX .TopLevelMenu

  2. Откройте TestCommandPackage.vsct. <Symbols> В разделе добавьте <IDSymbol> элемент для подменю, один для группы подменю и один для команды, все в <GuidSymbol> узле с именем GUIDTopLevelMenuCmdSet. Это тот же узел, который содержит <IDSymbol> элемент для меню верхнего уровня.

    <IDSymbol name="SubMenu" value="0x1100"/>
    <IDSymbol name="SubMenuGroup" value="0x1150"/>
    <IDSymbol name="cmdidTestSubCommand" value="0x0105"/>
    
  3. Добавьте в раздел только что созданный подменю <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, и является дочерним элементом меню верхнего уровня.

  4. Добавьте группу меню, определенную на шаге 2, в <Groups> раздел и сделайте ее дочерним элементом подменю.

    <Group guid="guidTestCommandPackageCmdSet" id="SubMenuGroup" priority="0x0000">
        <Parent guid="guidTestCommandPackageCmdSet" id="SubMenu"/>
    </Group>
    
  5. Добавьте новый <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>
    
  6. Создайте решение и начните отладку. Вы увидите экспериментальный экземпляр.

  7. Щелкните TestMenu, чтобы увидеть новое подменю с именем Sub Menu. Щелкните меню "Подменю ", чтобы открыть подменю и увидеть новую команду, тестовую подменю. Обратите внимание, что нажатие кнопки "Тестовая команда" ничего не делает.

Добавление команды

  1. Откройте TestCommand.cs и добавьте следующий идентификатор команды после существующего идентификатора команды.

    public const int cmdidTestSubCmd = 0x0105;
    
  2. Добавьте вложенную команду. Найдите конструктор команд. Добавьте следующие строки сразу после вызова 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);
        }
    }
    
  3. Добавьте 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);
    }
    
  4. Выполните сборку решения и запустите отладку. Должен появиться экспериментальный экземпляр.

  5. В меню TestMenu щелкните вложенное меню и выберите команду Test Sub Command. Появится поле сообщения и отобразится текст "Test Command Inside TestCommand.SubItemCallback()".