Visual Studio 扩展入门(五)菜单篇 中

<Group>(命令组)是始终在菜单或工具栏上一起显示的命令的集合,这个集合通常包含按钮,但也可以包含其他菜单或组合框。 可以通过在 .vsct 文件的 <CommandPlacements >元素中将命令组分配到不同的父菜单来复用该命令组。
在IDE中,通过复用命令按钮可以提高开发效率,很多地方都实现了复用命令按钮的操作,如打开项目属性,可以通过以下两处的复用命令"项目属性"按钮:
image.pngimage.png

一、示例一:通过CommandPlacements 复用命令按钮

1、创建菜单命令

  1. 创建 VSIX 项目模板,并命名为ReusableButtons。
  2. 通过" Visual c # 项> Extensibility(扩展性) > Command(命令)",添加自定义命令 ReusableCommand.cs。

此时解决方案目录如下:
image.png

通过创建ReusableCommand.cs,.vsct文件已经自动创建了ReusableCommand的相关按钮信息如下:
image.png
运行调试后,只有一个命令按钮效果如下:
image.png
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命令按钮。
此时运行调试,效果如下:
image.png
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>

此时运行调试,效果如下:
image.png

Priority 字段的值决定了命令在新命令组中的位置。具有较低优先级值的命令显示在具有较高优先级值的命令之前。CommandPlacement 元素中设置的优先级会覆盖项目定义中设置的优先级。允许重复优先级值,但无法保证具有相同优先级值的命令的相对位置,因为devenv /setup命令从注册表创建最终接口的顺序可能不一致。

博客的示例源码:https://github.com/21thCenturyBoy/VSIX_HelloWorld

posted @ 2021-07-15 11:02  20世纪少年  阅读(177)  评论(0编辑  收藏  举报