【问题标题】:Append item to Add menu of solution- or project node in Solution Explorer在解决方案资源管理器中将项目附加到解决方案或项目节点的添加菜单
【发布时间】:2014-11-13 05:47:21
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    通常,您需要知道要扩展的菜单的命令和包 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。这将显示一个包含包 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 的名称的……这些名称是由 Visual Studio SDK 中包含的 vsshlids.h 头文件定义的。因此,对于上面显示的 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>
    

    我希望在 vsshlids.h 中找到一个与命令 id 匹配的 IDM_VS_CTXT_ 常量(或类似的东西),但是没有……相反,我在 stdidcmd.h 中找到了 cmdidShellWindowNavigate7 和 cmdidShellWindowNavigate5 常量;并尝试了它们...

    首先我为两个命令组创建了新的 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 感觉有点笨拙 常量,但结果我得到了这个......

    【讨论】:

    • 能否提供一个包含示例代码的文件链接?
    • 谢谢@Matze,这真的很有帮助。我想找到一些关于 vsct 的文档,因为我仍然不明白你是如何发现“cmdidShellWindowNavigate7”实际上是“项目”添加菜单
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多