将 SubMenu 添加到 VS 解决方案资源管理器项目和项目节点类型

Add SubMenu to VS solution explorer project and item node types

我想构建一个扩展解决方案资源管理器上下文菜单的 VS add-in

我知道如何使用 IDM_VS_CTXT_ITEMNODEIDM_VS_CTXT_PROJNODE 添加 VS add-in menu item,就像下面的示例

<Group guid="guidCmdSet" id="grpIdMenuProjectItem" priority="0x0700">
  <Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_ITEMNODE" />
</Group>

但是我想显示的菜单应该显示带有子项的复杂上下文菜单。 我想将相同的菜单项添加到项目和项目上下文菜单。

所以我试过了

<Group guid="guidCmdSet" id="grpIdMenuProjectItem" priority="0x0700">
   <Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_ITEMNODE" />
   <Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_PROJNODE"/>
</Group>

但 id 不起作用。

问题是 vsct 文件为 children 声明了 parents 所以我不能只声明一个 child 和 link 到几个parents.

如何向项目和项目上下文菜单添加相同的菜单?我想避免复制粘贴 grpIdMenuProjectItem children 它是可能的。

整个源代码示例can be found at github

Add SubMenu to VS solution explorer project and item node types

您可以使用 CommandPlacements to make one button be used in several menus.

解决方案

通常,你可以使用这种格式来实现你的需求:

 <CommandPlacements>
            <CommandPlacement guid="xxx(the same button guid)" id="xxx(the same button id)" priority="0xF00">
                <Parent guid="xxx(the first group guid)" id="xxx(the first group id)"/> 
            </CommandPlacement>

       <CommandPlacement guid="xxx(the same button guid)" id="xxx(the same button id)" priority="0xF00">
                <Parent guid="xxx(the second group guid)" id="xxx(the second group id)"/>   
            </CommandPlacement>

        ..........

    </CommandPlacements>

在你的情况下,例如,我让你的按钮 Sample Menu Item 1IDM_VS_CTXT_ITEMNODEIDM_VS_CTXT_PROJNODE 中都使用。

因为你在IDM_VS_CTXT_ITEMNODE下的QQQ Menu的子菜单里做了Sample Menu Item 1,你只需要定义按钮Sample Menu Item 1 在 CommandPlacements 中是这样的:

<CommandPlacements>
        <CommandPlacement guid="guidCmdSet" id="sampleMenuItem" priority="0xF00">
            <Parent guid="guidVSIXProject1PackageCmdSet" id="MyMenuGroup"/> 
        </CommandPlacement>
</CommandPlacements>

解决方案是使用 CommandPlacement 正如 Perry 所说

为了使用子菜单项复制同一组,我从 grpIdMenuProjectItem 组声明中删除了父元素

<Group guid="guidCmdSet" id="grpIdMenuProjectItem" priority="0x0700">
</Group>

并为项、项目和文件夹父级添加了三个命令放置

<CommandPlacements>
    <CommandPlacement guid="guidCmdSet" id="grpIdMenuProjectItem" priority="0xF00">
            <Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_ITEMNODE" />
    </CommandPlacement>
    <CommandPlacement guid="guidCmdSet" id="grpIdMenuProjectItem" priority="0xF00">
            <Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_PROJNODE" />
    </CommandPlacement>
    <CommandPlacement guid="guidCmdSet" id="grpIdMenuProjectItem" priority="0xF00">
            <Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_FOLDERNODE" />
    </CommandPlacement>
</CommandPlacements>

CommandPlacements节点应添加在Commands节点as documented之后。