共用方式為


將子功能表新增至功能表

本逐步解說是以將功能表新增至 Visual Studio 功能表列中的示範為基礎,說明如何將子功能表新增至 TestMenu 功能表。

子功能表是出現在另一個功能表中的次要功能表。 子功能表可由其名稱後面的箭號來識別。 按一下該名稱便可顯示子功能及其命令。

本逐步解說會在 Visual Studio 功能表列的功能表中建立子功能表,並在子功能表上放置新命令。 本逐步解說也會實作新命令。

將子功能表新增至功能表

  1. 遵循將功能表新增至 Visual Studio 功能表列中的步驟,來建立專案和功能表項目。 本逐步解說中的步驟假設 VSIX 專案名稱為 TopLevelMenu

  2. 開啟 TestCommandPackage.vsct。 在 <Symbols> 區段中,為子功能表新增 <IDSymbol> 元素,一個用於子功能表群組,一個用於命令,全都位於名為 "guidTopLevelMenuCmdSet" 的 <GuidSymbol> 節點中。這是包含最上層功能表 <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] 以查看名為「子功能表」的新子功能表。 按一下 [子功能表] 以開啟子功能表,並查看新命令,即 [測試子命令]。 請注意,按一下 [測試子命令] 不會執行任何動作。

新增命令

  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] 功能表上,按一下 [子功能表],然後按一下 [測試子命令]。 應該會出現訊息方塊並顯示文字:「測試命令位於 TestCommand.SubItemCallback() 內」。