Visual Studio 带有自定义命令和子命令的扩展

Visual Studio Extension with custom command and subcommands

我正在尝试使用 Visual Studio 2017 创建一个简单的 Visual Studio 扩展,它将命令添加到解决方案资源管理器中的项目上下文菜单。我想将我的命令组合在一起添加到一个主要选项中,然后从该主要选项中我希望可以访问我的命令,就像添加->新项目、添加->现有项目、添加->Class 等在项目的上下文菜单中工作。

阅读文档后,这是我到目前为止为我的 vsct 文件得出的结论:

<Commands package="guidMainItemPackage">      
  <Groups>
    <Group guid="guidMainItemPackageCmdSet" id="MyMenuGroup" priority="0x0600" />              
    <Group guid="guidMainItemPackageCmdSet" id="SubMenuGroup" priority="0x0601" />              
  </Groups>

  <Buttons>
    <Button guid="guidMainItemPackageCmdSet" id="MainItemId" priority="0x0100" type="Button">
      <Parent guid="guidMainItemPackageCmdSet" id="MyMenuGroup" />
      <Icon guid="guidImages" id="bmpPic1" />
      <Strings>
        <ButtonText>Invoke MainItem</ButtonText>
      </Strings>
    </Button>

    <Button guid="guidMainItemPackageCmdSet" id="cmdidSubItem" priority="0x0101" type="Button">
      <Parent guid="guidMainItemPackageCmdSet" id="SubMenuGroup" />
      <Icon guid="guidImages1" id="bmpPic1" />
      <Strings>
        <ButtonText>Invoke SubItem</ButtonText>
      </Strings>
    </Button>
  </Buttons>

  <Bitmaps>     
    <Bitmap guid="guidImages" href="Resources\MainItem.png" usedList="bmpPic1, bmpPic2, bmpPicSearch, bmpPicX, bmpPicArrows, bmpPicStrikethrough" />
    <Bitmap guid="guidImages1" href="Resources\SubItem.png" usedList="bmpPic1, bmpPic2, bmpPicSearch, bmpPicX, bmpPicArrows, bmpPicStrikethrough" />
  </Bitmaps>
</Commands>

<CommandPlacements>
  <CommandPlacement guid="guidMainItemPackageCmdSet" id="MyMenuGroup" priority="0xFFFF">
    <Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_PROJNODE" />
  </CommandPlacement>    
  <CommandPlacement guid="guidMainItemPackageCmdSet" id="SubMenuGroup" priority="0xFFFE">
    <Parent guid="guidMainItemPackageCmdSet" id="MyMenuGroup" />
  </CommandPlacement>
</CommandPlacements>

<Symbols>
  <GuidSymbol name="guidMainItemPackage" value="{30f66380-eeeb-48bf-8554-0d63d87194af}" />  
  <GuidSymbol name="guidMainItemPackageCmdSet" value="{98ee7e8f-c421-4f0e-a9e9-86eab5141563}">
    <IDSymbol name="MyMenuGroup" value="0x1020" />
    <IDSymbol name="SubMenuGroup" value="0x1028" />
    <IDSymbol name="MainItemId" value="0x0100" />
    <IDSymbol value="4129" name="cmdidSubItem" />
  </GuidSymbol>
  <GuidSymbol name="guidImages" value="{b3c2dfad-df35-4e6b-880e-8018ce6c3d0f}">
    <IDSymbol name="bmpPic1" value="1" />
    <IDSymbol name="bmpPic2" value="2" />
    <IDSymbol name="bmpPicSearch" value="3" />
    <IDSymbol name="bmpPicX" value="4" />
    <IDSymbol name="bmpPicArrows" value="5" />
    <IDSymbol name="bmpPicStrikethrough" value="6" />
  </GuidSymbol> 
  <GuidSymbol value="{93d3ad22-fe33-40da-b85f-a926952e3914}" name="guidImages1">
    <IDSymbol name="bmpPic1" value="1" />
    <IDSymbol name="bmpPic2" value="2" />
    <IDSymbol name="bmpPicSearch" value="3" />
    <IDSymbol name="bmpPicX" value="4" />
    <IDSymbol name="bmpPicArrows" value="5" />
    <IDSymbol name="bmpPicStrikethrough" value="6" />
  </GuidSymbol>
</Symbols>

所以基本上我已经创建了两个自定义命令添加到我的项目,每个命令一个按钮,每个按钮一个组和每个组的命令放置(其他一切只是默认生成的 vsct模板)。

我的问题是,使用上面的代码,在显示第一个命令时,它没有子项。实现所需布局的正确 vsct 内容是什么?

经过更多的尝试和错误(主要是错误),我决定通过 Visual Studio 本身的命令定义来找到一组类似的命令,我终于找到了答案。以下是实现此结构所需执行的步骤:

  1. 创建一个组并将该组的父级设置为 Visual Studio 项目上下文菜单。
  2. 创建一个菜单,其父级是在步骤 1 中创建的组。
  3. 创建第二个组,其父组是在步骤 2 中创建的菜单。
  4. 仅为子项创建按钮。
  5. 为第 4 步中创建的子项创建命令位置,将每个按钮放置在第 3 步中创建的组中。