Visual Studio 扩展入门(五)菜单篇 中
<Group>(命令组)是始终在菜单或工具栏上一起显示的命令的集合,这个集合通常包含按钮,但也可以包含其他菜单或组合框。 可以通过在 .vsct 文件的 <CommandPlacements >元素中将命令组分配到不同的父菜单来复用该命令组。
在IDE中,通过复用命令按钮可以提高开发效率,很多地方都实现了复用命令按钮的操作,如打开项目属性,可以通过以下两处的复用命令"项目属性"按钮:
一、示例一:通过CommandPlacements 复用命令按钮
1、创建菜单命令
- 创建 VSIX 项目模板,并命名为ReusableButtons。
- 通过" Visual c # 项> Extensibility(扩展性) > Command(命令)",添加自定义命令 ReusableCommand.cs。
此时解决方案目录如下:
通过创建ReusableCommand.cs,.vsct文件已经自动创建了ReusableCommand的相关按钮信息如下:
运行调试后,只有一个命令按钮效果如下:
2、通过<CommandPlacements>创建"ReusableCommandMenu"菜单>"Invoke ReusableCommand"
找到name属性为"guidReusableButtonsPackageCmdSet"的<GuidSymbol>元素节点,添加<IDSymbol>元素:
<IDSymbol name="ReusableCommandMenu" value="0x0200" />
<IDSymbol name="ReusableCommandMenuGroup" value="0x0300" />
在<Commands>节点之内,<Groups>节点之前创建<Menus>节点,并添加<Menu>节点:
<Menus>
<Menu guid="guidReusableButtonsPackageCmdSet" id="ReusableCommandMenu" priority="0x700" type="Menu">
<Parent guid="guidSHLMainMenu" id="IDG_VS_MM_TOOLSADDINS" />
<Strings>
<ButtonText>ReusableCommandMenu</ButtonText>
</Strings>
</Menu>
</Menus>
在<Groups>节点元素内添加<Group>节点:
<Group guid="guidReusableButtonsPackageCmdSet" id="ReusableCommandMenuGroup" priority="0x0800">
<Parent guid="guidReusableButtonsPackageCmdSet" id="ReusableCommandMenu"/>
</Group>
在<Commands>元素节点后面添加<CommandPlacements>元素,并添加一个<CommandPlacement>节点:
<CommandPlacements>
<CommandPlacement guid="guidReusableButtonsPackageCmdSet" id="ReusableCommandId" priority="0xE00">
<Parent guid="guidReusableButtonsPackageCmdSet" id="ReusableCommandMenuGroup"/>
</CommandPlacement>
</CommandPlacements>
通过CommandPlacement的id属性与命名按钮的id绑定,并在<Parent>指定父元素id为ReusableCommandMenuGroup的菜单组。实现复用Invoke ReusableCommand命令按钮。
此时运行调试,效果如下:
3、通过<CommandPlacements>创建"解决方案管理器"窗口>工具栏>小图标"Invoke ReusableCommand"
在<Commands>元素节点后面添加<CommandPlacements>元素,并添加一个<CommandPlacement>节点,此时节点<CommandPlacements>应该如下:
<CommandPlacements>
<CommandPlacement guid="guidReusableButtonsPackageCmdSet" id="MyMenuGroup" priority="0xF00">
<Parent guid="guidSHLMainMenu" id="IDM_VS_TOOL_PROJWIN"/>
</CommandPlacement>
<CommandPlacement guid="guidReusableButtonsPackageCmdSet" id="ReusableCommandId" priority="0xE00">
<Parent guid="guidReusableButtonsPackageCmdSet" id="ReusableCommandMenuGroup"/>
</CommandPlacement>
</CommandPlacements>
此时运行调试,效果如下:
Priority 字段的值决定了命令在新命令组中的位置。具有较低优先级值的命令显示在具有较高优先级值的命令之前。CommandPlacement 元素中设置的优先级会覆盖项目定义中设置的优先级。允许重复优先级值,但无法保证具有相同优先级值的命令的相对位置,因为devenv /setup命令从注册表创建最终接口的顺序可能不一致。