visual studio插件开发-Menu( 三 )

  1. 在Menus节点下新建一个menu:MyMenu,以上面的MyMenuGroup1位parent
<Menus>  <Menu guid ="guidMenuDemoVSIXPackageCmdSet" id="MyMenu" priority="0x3110" type="Menu">    <Parent guid="guidMenuDemoVSIXPackageCmdSet" id="MyMenuGroup1"/>    <Strings>      <ButtonText>New</ButtonText>      <CommandName>New</CommandName>    </Strings>  </Menu></Menus>
  1. 再创建一个group:MyMenuGroup2 以上面的MyMenu为parent
<Group guid="guidMenuDemoVSIXPackageCmdSet" id="MyMenuGroup2" priority="0x0600">    <Parent guid="guidMenuDemoVSIXPackageCmdSet" id="MyMenu"/></Group>
  1. 创建Button以MyMenuGroup2为parent
<Buttons>  <Button guid="guidMenuDemoVSIXPackageCmdSet" id="TestCommandId" priority="0x0100" type="Button">    <Parent guid="guidMenuDemoVSIXPackageCmdSet" id="MyMenuGroup2" />    <Icon guid="guidImages" id="bmpPic1" />    <Strings>      <ButtonText>Invoke TestCommand</ButtonText>    </Strings>  </Button></Buttons>完整定义:
visual studio插件开发-Menu

文章插图
如果想要同时显示在多个地方咋整比如 我既要显示在工程右键菜单里面,又要显示在普通文件的右键菜单,又要显示在代码右键菜单
这里就用到上面提到的 CommandPlacements
还是以上面的例子,这时候第一步的group1:MyMenuGroup2的parent就不能填了
而是要添加CommandPlacements  , id要填 MyMenuGroup2,Parent填具体ID
<CommandPlacements>    <CommandPlacement guid="guidMenuDemoVSIXPackageCmdSet" id="MyMenuGroup1" priority="0x0000">      <Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_PROJNODE"/>    </CommandPlacement>    <CommandPlacement guid="guidMenuDemoVSIXPackageCmdSet" id="MyMenuGroup1" priority="0x0000">      <Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_ITEMNODE" />    </CommandPlacement>    <CommandPlacement guid="guidMenuDemoVSIXPackageCmdSet" id="MyMenuGroup1" priority="0x0000">      <Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_CODEWIN" />    </CommandPlacement></CommandPlacements>
visual studio插件开发-Menu

文章插图
image
效果如下:

visual studio插件开发-Menu

文章插图
image
怎样动态展示菜单比如 ,非json文件的就不展示
visual studio插件开发-Menu

文章插图
是json文件的才展示
visual studio插件开发-Menu

文章插图
在Button的增加 DynamicVisibility
 <Button guid="guidMenuDemoVSIXPackageCmdSet" id="TestCommandId" priority="0x0100" type="Button">    <Parent guid="guidMenuDemoVSIXPackageCmdSet" id="MyMenuGroup2" />    <!--这个 -->    <CommandFlag>DynamicVisibility</CommandFlag>    <Icon guid="guidImages" id="bmpPic1" />    <Strings>      <ButtonText>Invoke TestCommand</ButtonText>    </Strings></Button>让VsPackage随着项目启动后就立即加载,不然动态判断逻辑无法提前指定
visual studio插件开发-Menu

文章插图
修改Command的初始化方法,拿到DTE,很多功能点需要用到它里面的接口,比如拿到当前选择的item

visual studio插件开发-Menu

文章插图
image
然后再初始化Menu的时候指定BeforeQueryStatus的逻辑为后缀为json才展示
visual studio插件开发-Menu

文章插图
总结我觉得对于visual studio中如何用插件来扩展menu 大概了解上面几点就差不多了 , 希望能帮助到你

推荐阅读