.net - 将项目附加到解决方案资源管理器中解决方案或项目节点的添加菜单

标签 .net visual-studio-extensions vsx vspackage vsct

如何在右键单击 Visual Studio 解决方案资源管理器时为“添加”菜单项添加子菜单?

我必须添加一个子菜单项,它会在右键单击 visual studio 解决方案并移至该菜单中的“添加”选项时显示。

我正在尝试使用 .vsct(对比包)。请帮我提出宝贵的建议

最佳答案

当然也有类似的问题,不过这好像是个特例...

通常,您需要知道要扩展的菜单的命令和包 ID。我通常通过启用 EnableVSIPLogging 来做到这一点注册表中的选项,如本文所述: http://blogs.msdn.com/b/dr._ex/archive/2007/04/17/using-enablevsiplogging-to-identify-menus-and-commands-with-vs-2005-sp1.aspx . EnableVSIPLogging选项是在 Visual Studio 2005 中引入的,但在任何较新的版本中仍然有效。

一旦EnableVSIPLogging选项已启用,您可以通过在按 Ctrl+Shift 的同时单击菜单项(或与命令互连的任何其他 UI 元素)来显示所需信息。这将显示一个包含包 guid 和命令/菜单 id 的消息框; Ctrl+C 将显示的菜单或命令数据复制到剪贴板,顺便说一下。如果您对菜单数据感兴趣(如果是上下文菜单,请在悬停该项目之前按 Ctrl+Shift)。

这是我在我的机器上得到的...

---------------------------
VSDebug Message
---------------------------
Menu data:
Guid = {D309F791-903F-11D0-9EFC-00A0C911004F}
GuidID = 4
CmdID = 850
Type = 0x00000100
Flags = 0x00000000
NameLoc = A&dd
---------------------------
OK   
---------------------------

菜单信息可用于创作您的 VSCT文件;您可能对这个问题感兴趣:Using vsx how do you create a sub menu with commands?

在阅读其他问题的答案时,您可能想知道这些人是如何计算出命令 guid 的名称的……这些名称是由 vsshlids.h 定义的头文件,包含在 Visual Studio SDK 中。因此,对于上面显示的 guid,我们发现...

// Guid for Shell's group and menu ids
DEFINE_GUID (guidSHLMainMenu,
    0xd309f791, 0x903f, 0x11d0, 0x9e, 0xfc, 0x00, 0xa0, 0xc9, 0x11, 0x00, 0x4f);

我们可以使用guidSHLMainMenu对于组定义...

<Group guid="your-command-set" id="your-group-id">
    <Parent guid="guidSHLMainMenu" id="..." />
</Group>

我希望找到 IDM_VS_CTXT_ vsshlids.h 中的常数(或类似的东西)与命令 ID 匹配,但不...相反,我找到了 cmdidShellWindowNavigate7cmdidShellWindowNavigate5 stdidcmd.h 中的常量;并试了一下...

首先我为两个命令组创建了新的 id-symbols...

<IDSymbol name="grpIdProjectContextAdd" value="0x1080" />
<IDSymbol name="grpIdSolutionContextAdd" value="0x1081" />

还有一个命令...

<IDSymbol name="cmdIdAddItemHelloWorld" value="0x1082" />

然后我定义了新的组;并使用获得的命令标识符作为父...

<Groups>
    <Group guid="your-command-set" id="grpIdProjectContextAdd">
        <Parent guid="guidSHLMainMenu" id="cmdidShellWindowNavigate7" />
    </Group>
    <Group guid="your-command-set" id="grpIdSolutionContextAdd">
        <Parent guid="guidSHLMainMenu" id="cmdidShellWindowNavigate5" />
    </Group>
</Groups>

当然,我需要一个按钮(默认放在项目的Add菜单中)。

<Commands>
    <Button guid="your-command-set" 
            id="cmdIdAddItemHelloWorld" priority="0x1100" type="Button">
        <Parent guid="your-command-set" id="grpIdProjectContextAdd" />
        <Strings>
            <ButtonText>Hello World</ButtonText>
        </Strings>
    </Button>
</Commands>

使按钮也出现在Add中解决方案节点的菜单,我使用命令放置...

<CommandPlacements>
    <CommandPlacement guid="your-command-set" 
                      id="cmdIdAddItemHelloWorld" priority="0x1100">
        <Parent guid="your-command-set" id="grpIdSolutionContextAdd" />
    </CommandPlacement>
 </CommandPlacements>

对我来说,使用 cmdidShellWindowNavigate7 感觉有点笨拙和 cmdidShellWindowNavigate5 常量,但结果我得到了这个......

enter image description here

关于.net - 将项目附加到解决方案资源管理器中解决方案或项目节点的添加菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26902158/

相关文章:

c# - 放入字节数组的德语特殊字符

c# - 如何用正则表达式替换包含圆括号(圆括号)的文本?

c# - 获取 cshtml 文件的语义模型?

c# - 打开不属于项目的 cs 文件时,有什么方法可以使 Intellisense 工作?

visual-studio - 您如何开发 Visual Studio 加载项?

c# - 将数组的一部分复制到列表的快速方法?

c# - 如何知道某个文件夹的文件是否正在被另一个进程使用?

visual-studio-extensions - VSIX - TextView 关闭时的事件

editor - 使用IVSInvisibleEditor和IVSPersistDocData,但如何释放它们?

visual-studio-2015 - 卸载 Microsoft ASP.NET 和 Web 工具