在Visual Studio中创建一个新的顶级菜单

时间:2010-11-22 06:16:06

标签: visual-studio add-in visual-studio-addins

我们有一个VS的补充,目前是从工具菜单启动的,该加载项包含一个UI,为用户提供了一些选项按钮,我现在要将其转换为可提供的顶级菜单相同的功能。

我已阅读this教程,它帮助我添加了一个新的顶级菜单,但无法真正理解所有步骤背后的逻辑。该指南并未真正说明每个步骤的创建或更改输出的方式 这些步骤创建的是一个新的顶级菜单,其下方有一个项目。我正在尝试在我的菜单中创建一些层次结构(即顶级 - >子类别 - >命令),但是所有组/菜单/ ID结构都失去了abit。 这些文件的结构有没有明确的解释?文档或教程?如果有人有这方面的经验并且可以帮助澄清事情我会非常感激...

3 个答案:

答案 0 :(得分:1)

我没有尝试过分层菜单项,但是我遇到了与Visual SDK .vcst文件类似的问题。这是一种痛苦。你可以做几件事。

  1. 将VS包编辑器安装到Visual Studio博客条目:http://blogs.msdn.com/b/visualstudio/archive/2010/09/08/introducing-the-vspackage-builder.aspx
  2. 下载执行类似操作的加载项的源代码(开源以便您可以看到它们是如何操作的)。示例是AnkhSVN,它是Visual Studio的Subversion存储库加载项。以下是源代码:http://ankhsvn.open.collab.net/source/browse/ankhsvn/

答案 1 :(得分:0)

我认为,如今“外接程序”是指作为VS软件包的扩展(使用VS SDK),因为“外接程序”是VS 2013及更低版本的较旧形式的扩展。 (如果您真的是“外接程序”,请参阅我的示例HOWTO: Adding buttons, commandbars and toolbars to Visual Studio .NET from an add-in

程序包使用.vsct文件。要回答您的问题,请参阅我的示例here的.vsct文件:

  • CommandTopMenu
  • CommandSubMenu

(要了解更多信息,请参见上下文菜单,工具栏等的其他内容)。在.vcst文件中,他们使用“ CommandPlacements”将项目的定义与“ placement”分开,并使用注释来解释3种项目之间的关系:

  1. 菜单(主菜单/顶部菜单/子菜单/上下文菜单)和工具栏。
  2. 组:组是其他组以及命令和子菜单的容器。
  3. 命令

记住规则:

  • 顶部菜单的父菜单始终是VS的主菜单,而不是组
  • 子菜单的父级始终是一个组,永远不会直接是工具栏或任何类型的菜单。
  • 命令的父代始终是一个组,绝不能直接是工具栏或任何类型的菜单(与子菜单相同的规则)
  • 组的父级可以是菜单,工具栏,上下文菜单等,也可以是另一个组。
  • 菜单(任何种类)或工具栏都可以由扩展名创建(VS的主菜单除外),也可以由VS的现有前缀(IDM_)标识。请参见GUIDs and IDs of Visual Studio menusGUIDs and IDs of Visual Studio toolbars
  • 一个组可以是新的(由您的扩展名创建),也可以是现有的Visual Studio组,其前缀为“ IDG_”。您在上面的链接中有一些内置的Visual Studio组,但是要获取更详尽的列表,请安装ExtensionTools扩展名(Mads Kristensen),该扩展名在.vsct文件中提供智能感知或检查其{{3 }}。

答案 2 :(得分:-1)

代码示例

<?xml version="1.0" encoding="utf-8"?>
<CommandTable xmlns="...">
  <!-- Extern section unchanged -->
  <Commands package="guidHowToPackagePkg">
    <Menus>
      <!-- New menu added -->
      <Menu guid="guidBasicVSCTSampleCmdSet" id="SubMenu" priority="0x200"
        type="Menu">
        <Parent guid="guidBasicVSCTSampleCmdSet" id="TopLevelMenuGroup" />
        <Strings>
          <ButtonText>Other Commands</ButtonText>
          <CommandName>Other Commands</CommandName>
        </Strings>
      </Menu>
    </Menus>
    <Groups>
      <!-- Group changed to SubMenuGroup and attached to SubMenu -->
      <Group guid="guidBasicVSCTSampleCmdSet" id="SubMenuGroup"
        priority="0x0600">
        <Parent guid="guidBasicVSCTSampleCmdSet" id="SubMenu"/>
      </Group>
    </Groups>

    <Buttons>
      <!-- We attached these two buttons to SubMenuGroup -->
      <Button guid="guidBasicVSCTSampleCmdSet" id="ThirdCommand" priority="0x0100"
        type="Button">
        <Parent guid="guidBasicVSCTSampleCmdSet" id="SubMenuGroup" />
        <Icon guid="guidImages" id="bmpPicX" />
        <Strings>
          <CommandName>ThirdCommand</CommandName>
          <ButtonText>Third Command</ButtonText>
        </Strings>
      </Button>
      <Button guid="guidBasicVSCTSampleCmdSet" id="FourthCommand"
        priority="0x0101" type="Button">
        <Parent guid="guidBasicVSCTSampleCmdSet" id="SubMenuGroup" />
        <Icon guid="guidImages" id="bmpPicArrows" />
        <Strings>
          <CommandName>FourthCommand</CommandName>
          <ButtonText>Fourth Command</ButtonText>
        </Strings>
      </Button>
    </Buttons>

  </Commands>

  <Symbols>
    <!-- We add a SubMenu and changed SubMenuGroup -->
    <GuidSymbol name="guidBasicVSCTSampleCmdSet" value="...">
      <IDSymbol name="SubMenu" value="0x0101" />
      <IDSymbol name="SubMenuGroup" value="0x0201" />
    </GuidSymbol>
  </Symbols>
</CommandTable>

这为您提供了以下顶级菜单:

enter image description here

这里有关于该主题的完整章节。这几乎解释了(层级)菜单上的所有内容。

http://dotneteers.net/blogs/divedeeper/archive/2010/05/23/vs-2010-package-development-chapter-2-commands-menus-and-toolbars.aspx