VSX规划Package文件

VSX是VS扩展,可以针对不同项目编写插件,虽然接触VSX的时间并不多,但是当了解VSX后深刻感受到VSX的魅力。

VSX的材料比较少,配置文件也很繁琐,当初我也走了不少弯路。

这篇文章将帮助您更好的管理Package文件(继承Package、注册命令的那个文件),想要理解这篇文章您应当对VSX有基础的了解,确保自己可以建立一个基础的VSX菜单,如果目前您还不了解VSX也没关系,我推荐您先阅读明年我18的文章。

看过基础材料后,感觉Package文件的内容真是多,包括初始化、注册控件、菜单过滤、回调,就算把菜单过滤和回调挪走,一个典型的注册命令代码也有这么多:

1 OleMenuCommand cmdidFindInSolutionExplorer = new OleMenuCommand(FindInSolutionExplorerCallback,
2                 new CommandID(GuidList.guidConvenientCmdSet, (int)PkgCmdIDList.cmdidFindInSolutionExplorer));
3             cmdidFindInSolutionExplorer.BeforeQueryStatus += new EventHandler(MenuFilter.ClinicalFilter);
4             mcs.AddCommand(cmdidFindInSolutionExplorer);

随着插件功能的丰富,百十来个命令让Package文件拥挤不堪,再加上过滤和回调,每次打开这个文件都头皮发麻,(就算把回调和过滤分离成单独文件,大批的回调和过滤函数也。。。)。

下面的解决方案可以让你优雅的注册命令,是读codemaid源码时学到的:

首先定义一个抽象类BaseCommand继承OleMenuCommand,并在BaseCommand下定义两个事件OnBeforeQueryStatus与OnExecute分别对应过滤和回调:

 1         private static void BaseCommand_BeforeQueryStatus(object sender, EventArgs e)
 2         {
 3             BaseCommand command = sender as BaseCommand;
 4             if (command != null)
 5             {
 6                 command.OnBeforeQueryStatus();
 7             }
 8         }
 9         protected virtual void OnBeforeQueryStatus()
10         {
11             Enabled = true;
12         }
13         private static void BaseCommand_Execute(object sender, EventArgs e)
14         {
15             BaseCommand command = sender as BaseCommand;
16             if (command != null)
17             {
18                 command.OnExecute();
19             }
20         }
21         protected virtual void OnExecute()
22         {
23         }

在构造函数中注册事件:

1         protected ClinicalVSXPackage Pkg { get; private set; }
2
3         protected BaseCommand(ClinicalVSXPackage pkg, CommandID id)
4             : base(BaseCommand_Execute, id)
5         {
6             Pkg = pkg;
7             BeforeQueryStatus += BaseCommand_BeforeQueryStatus;
8         }

Pkg是将Package类本身传进来,方便传递dte等成员。

这样就可以在Package文件中优雅的注册命令了:

 1         private readonly ICollection<BaseCommand> _commands = new List<BaseCommand>();
 2
 3         private void RegisterCommands()
 4         {
 5             var mcs = MenuCommandService;
 6             if (null == mcs)
 7                 return;
 8             _commands.Add(new 命令1(this));
 9             _commands.Add(new 命令2(this));
10             _commands.Add(new 命令3this));
11            ....
12             foreach (var command in _commands)
13                 mcs.AddCommand(command);
14         }

这样当你打算新建一个命令,需要添加一个独立的类继承刚才的BaseCommand

并实现过滤和回调事件,一个典型的命令类:

 1     internal class 命令1 : BaseCommand
 2     {
 3         public 命令1(Package pkg)
 4             : base(pkg, new CommandID(CmdSetID, (int)PkgCmdIDList.命令ID))
 5         { }
 6
 7         protected override void OnBeforeQueryStatus()
 8         {
 9         }
10         protected override void OnExecute()
11         {
12             base.OnExecute();
13         }
14     }
时间: 2024-10-09 10:53:33

VSX规划Package文件的相关文章

Python工程文件中的名词解释---Module与Package的区别

当我们在已有的Python工程文件中创建新的内容是,通常会有两种类型文件供你选择---Module和Package,对于初学者来说会搞不清楚这两种文件直接的关系.这里就来解释一下这两者之间的关系. Module简介:  中文翻译成"模块",所谓的模块其实就是能够独立的完成一组任务的代码集.在Python里面Module一般就是一个独立的.py文件(有时候也可能是多个). Package简介:  中文翻译成"包",在Python中,Package就相当于多个Modul

在eclipse下,package,source folder,folder的区别

在eclipse下,package,source folder,folder都是文件夹. 它们的区别如下:package:当你在建立一个package时,它自动建立到source folder下,也只能建立在这个目录之下. source folder:存放java源代码的文件夹,当然也包括一些package文件夹,还可以包含其他文件.项目构建后,source folder里面的java自动编译成class文件到相应的bin文件夹中,其他文件也会移到到相应的目录下. folder:里面可以放入任何

Go语言(遍历文件夹)

今天来讲一个Go语言操作文件的问题,即如何遍历一个文件夹下的所有文件. 代码如下 package main import ( "path/filepath" "os" "fmt" "flag" ) func getFilelist(path string) { err := filepath.Walk(path, func(path string, f os.FileInfo, err error) error { if f

struts文件上传拦截器中参数的配置(maximumSize,allowedTypes ,allowedExtensions)问题

<interceptor-ref name="fileUpload"> <param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg,image/pjpeg</param> <!-- 图片不能大于5M --> <param name="maximumSize">5242880</param> </

JAVA基础篇—文件与流

处理字节流的抽象类 InputStream 是字节输入流的所有类的超类,一般我们使用它的子类,如FileInputStream等. OutputStream是字节输出流的所有类的超类,一般我们使用它的子类,如FileOutputStream等. 2.InputStreamReader  OutputStreamWriter 处理字符流的抽象类 InputStreamReader 是字节流通向字符流的桥梁,它将字节流转换为字符流. OutputStreamWriter是字符流通向字节流的桥梁,它将

folder、source folder、package 区别与联系

在eclipse下,package,source folder,folder都是文件夹. 它们的区别如下:  package:当你在建立一个package时,它自动建立到source folder下,也只能建立在这个目录之下. source folder:存放java源代码的文件夹,当然也包括一些package文件夹,还可以包含其他文件.  项目构建后,source folder里面的java自动编译成class文件到相应的/web-inf/classes文件夹中,其他文件也会移到/web-in

信息系统监理中的监理规划、监理大纲、监理细则的区别与作用

监理大纲.监理规划和监理细则都是为某一个工程而在不同阶段编制的监理文件,他们是密贴联系的,但同时又有区别.简要叙述如下: 监理大纲是轮廓性文件,是编制监理规划的依据. 监理规划是指导监理开展具体监理工作的纲领性文件. 监理实施细是操作性文件,要依据监理规划来编制. 也就是说从监理大纲到监理规划再到监理实施细则,是逐步细化的. 区别主要是: 监理大纲在投标阶段根据招标文件编制,目的是承揽工程. 监理规划是在签定监理委托合同后在总监的主持下编制,是针对具体的工程指导监理工作的纲领性文件.目的在于指导

10.java拷贝文件夹

文件复制 文件夹拷贝 文件复制 文件复制步骤: 1.建立文件代理->File源文件/File目的文件 2.设立管道,建立管道 3.数据装箱 4.循环读取,循环输出 5.关闭流 package 文件夹的拷贝; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; impo

eclipse 下面的folder,source folder,package的区别与作用

首先明确一点,folder,source folder,package都是文件夹,既然是文件夹,那么任何的文件都可以往这三种文件夹下面的放.1.他们的区别folder就是普通的文件夹,它和我们window下面使用的文件夹没有任何区别source folder文件夹是一种特别的文件夹,如果你用面向对象的思想去看待这个source folder,那么他是folder的一个子集,作为子集,肯定是有folder的所有功能,而且还有自己特别的功能,他的特别之处,就是在source folder下面的jav