Ajouter un sous-menu à un menu

Cette procédure pas à pas s’appuie sur la démonstration dans Ajouter un menu à la barre de menus Visual Studio en montrant comment ajouter un sous-menu au menu TestMenu .

Un sous-menu est un menu secondaire qui apparaît dans un autre menu. Un sous-menu peut être identifié par la flèche qui suit son nom. Le fait de cliquer sur le nom entraîne l’affichage du sous-menu et de ses commandes.

Cette procédure pas à pas crée un sous-menu dans un menu de la barre de menus de Visual Studio et place une nouvelle commande dans le sous-menu. La procédure pas à pas implémente également la nouvelle commande.

Ajouter un sous-menu à un menu

  1. Suivez les étapes décrites dans Ajouter un menu à la barre de menus de Visual Studio pour créer le projet et l’élément de menu. Les étapes décrites dans cette procédure pas à pas supposent que le nom du projet VSIX est TopLevelMenu.

  2. Ouvrez TestCommandPackage.vsct. Dans la <Symbols> section, ajoutez un <IDSymbol> élément pour le sous-menu, un pour le groupe de sous-menus et un pour la commande, tous dans le <GuidSymbol> nœud nommé « guidTopLevelMenuCmdSet ». Il s’agit du même nœud que celui qui contient l’élément <IDSymbol> du menu de niveau supérieur.

    <IDSymbol name="SubMenu" value="0x1100"/>
    <IDSymbol name="SubMenuGroup" value="0x1150"/>
    <IDSymbol name="cmdidTestSubCommand" value="0x0105"/>
    
  3. Ajoutez le sous-menu nouvellement créé à la <Menus> section.

    <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>
    

    La paire GUID/ID du parent spécifie le groupe de menus généré dans Ajouter un menu à la barre de menus Visual Studio et est un enfant du menu de niveau supérieur.

  4. Ajoutez le groupe de menus défini à l’étape 2 à la <Groups> section et définissez-le comme enfant du sous-menu.

    <Group guid="guidTestCommandPackageCmdSet" id="SubMenuGroup" priority="0x0000">
        <Parent guid="guidTestCommandPackageCmdSet" id="SubMenu"/>
    </Group>
    
  5. Ajoutez un nouvel <Button> élément à la <Buttons> section pour définir la commande créée à l’étape 2 en tant qu’élément du sous-menu.

    <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. Générez la solution et commencez le débogage. Vous devez voir l’instance expérimentale.

  7. Cliquez sur TestMenu pour afficher un nouveau sous-menu nommé Sub Menu. Cliquez sur Sous-menu pour ouvrir le sous-menu et voir une nouvelle commande, Test Sub Command. Notez que le fait de cliquer sur La sous-commande test ne fait rien.

Ajouter une commande

  1. Ouvrez TestCommand.cs et ajoutez l’ID de commande suivant après l’ID de commande existant.

    public const int cmdidTestSubCmd = 0x0105;
    
  2. Ajoutez la sous-commande. Recherchez le constructeur de commandes. Ajoutez les lignes suivantes juste après l’appel à la AddCommand méthode.

    CommandID subCommandID = new CommandID(CommandSet, cmdidTestSubCmd);
    MenuCommand subItem = new MenuCommand(new EventHandler(SubItemCallback), subCommandID);
    commandService.AddCommand(subItem);
    

    Le SubItemCallback gestionnaire de commandes sera défini ultérieurement. Le constructeur doit maintenant ressembler à ceci :

    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. Ajoutez SubItemCallback(). Il s’agit de la méthode appelée lorsque la nouvelle commande du sous-menu est cliqué.

    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. Générez le projet et commencez le débogage. L’instance expérimentale doit apparaître.

  5. Dans le menu TestMenu , cliquez sur Sous-menu , puis sur Test Sub Command. Une zone de message doit apparaître et afficher le texte « Test Command Inside TestCommand.SubItemCallback() ».