Visual Studio扩展开发之菜单设置--拒绝反复输入样板代码,编写IDE插件,提升编码效率

一、功能描述

      为了扩展visual studio的功能,可以添加菜单来实现。如下图所示,添加了菜单“FirstCommand”,在该菜单中存在三个Group,即三个菜单组(每两个组之间用分隔线隔开)。第一个Group上放了一个Button按钮NotifyProperty;第二个上面放置了两个Button,分别为“属性(get)”和“属性(get,set)”;第三个Group上放置了一个Button,即“CommandGenerator”。


二、项目创建

    (拒绝反复输入样板代码,编写IDE插件,提升编码效率)

1、 新建项目

利用Extensibility选项下的VISX Project模板创建一个vs扩展项目。项目名称取名为FirstCommand。如果已经安装的vs中缺少Extensibility选项,则是没有安装visual studio SDK 引起的。需要在安装vs时选中该选项,或者重新运行visual studio的安装程序,新增visual studio SDK的安装。


2、 添加第一个命令文件

创建第一个命令,首先添加一个Item,即利用Extensibility项目下的CustomModel模板创建一个名称为”NotifyProperty”子项,如下图所示。



      NotifyProperty创建完成后,可以找到NotifyProperty.cs文件,该文件中,private void MenuItemCallback(object sender, EventArgs e)方法就是命令的回调方法。所有命令的功能都将在其中完成。


      修改一下MenuItemCallback方法,当触发该命令时,弹出对话框,显示“This is NotifyPropertyCommand”。如下图所示。

3、创建第2-4个命令文件

      如上面所述,用同样的方法创建PropertyGet.cs,PropertyGetAndSet.cs,CommandGenerator.cs。并分别在其回调函数中添加相应的处理代码。

三、菜单添加

      添加菜单将使用NotifyPropertyPackage.vcst文件。该文件关键部分有Commands节点和Symbols节点组成,Commands节点下又有Groups,Buttons,Menus等主要节点。缩减后的格式如下:


这个文件主要包括Commands节点和Symbols节点。其中,在Symbols节点下,系统生成了每一个命令对应的子节点。

1、 Symbols节点


在symbols中,IDE自动生成了刚才创建的四个命令文件对应的IDSymbol节点,每个IDSymbol对有name和value参数。其中name是代表它的名字,可以自己改动,而value对应命令文件中系统生成的常量CommandId。

 

IDSymbol节点的父节点是GuidSymbol,其value值为命令文件中由系统自动生成的CommandSet常量。(注:IDE可能会对不同的命令文件生成不同的CommandSet常量,也可能多个命令文件的CommandSet相同。如果多个命令文件的CommandSet值不同,则Symbols下面会生成多个GuidSymbol节点与其对应)。


2、 创建菜单IDSymbol

为了能够创建菜单,首先需要自行定义菜单的IDSymbol。在Symbols节点下的名称为guidNotifyPropertyPackageCmdSetGUIDSymbol节点下面,添加一个IDSymbol。

<IDSymbol name="TopLevelMenu" value="0x1021"/> 

 

3、 创建菜单节点

IDE软件自动生成的NotifyPropertyPackage.vcst文件中,默认没有添加<Menus>节点,需要手动添加进去。<Menus>位于<Commands>中,所以在<Commands>中添加下面的代码。

<Menus> 

      <Menu guid="guidNotifyPropertyPackageCmdSet" id="TopLevelMenu" priority="0x700" type="Menu"> 

        <Parent guid="guidSHLMainMenu"  id="IDG_VS_MM_TOOLSADDINS" /> 

        <Strings> 

          <ButtonText>TestMenu</ButtonText> 

          <CommandName>SimpleCommand</CommandName> 

        </Strings> 

    </Menu> 

</Menus> 

4.修改菜单组(Group)

将系统自动生成的Groups节点下Group节点中的Parent子节点修改为刚才建立的菜单的信息,即修改为idGuid信息。


5、测试。

此时显示出几个菜单如下。


6、增加Group

在这个菜单上,可以看到没有分组,也就是仅仅只有一个Group。要显示多个Group,就要增加Group的数量。

为了Group,那首先要在Symbols中增加IDSymbol对象。


修改后变成如下内容:


当增加了IDSymbox后,就需要增加Group节点。


最后,需要修改每个Button到底归属于哪一个Group。


再次测试,可以看到菜单中的按钮已经分为三个组了。


7、按钮显示内容

顶层菜单显示内容位于Menus->Menu->Strings->CommandName节点。


菜单中按钮的显示内容Buttons->Button->Strings->ButtonText节点。


四、几点说明

(1)    显示顺序

      显示顺序包括:在vs顶端菜单中,顶级菜单与其它菜单的排序;菜单Group的排序;菜单按钮的排序。在每一个节点中,都有priotity属性,按照属性从小到大的顺序进行排序。如果priority值相同,则会根据节点对象的id值(指IDSymbol中的value值)排序。

(2)    编译时IDE提示id不存在的问题

      有时id明明是系统生成的,表面上也看不出什么问题,编译时IDE始终提示id不存在。有可能是id与系统某些值产生了冲突(猜的,具体也不清楚),可以通过修改id来解决。修改时,要把命令文件中对应的CommandId常量一起修改了。具体改为多少,可以自己试着改,改的值至少是Symbols对象下不存在的吧。




猜你喜欢

转载自blog.csdn.net/jiuzaizuotian2014/article/details/78417496