VSX规划Package文件
VSX是VS扩展,可以针对不同项目编写插件,虽然接触VSX的时间并不多,但是当了解VSX后深刻感受到VSX的魅力。
VSX的材料比较少,配置文件也很繁琐,当初我也走了不少弯路。
这篇文章将帮助您更好的管理Package文件(继承Package、注册命令的那个文件),想要理解这篇文章您应当对VSX有基础的了解,确保自己可以建立一个基础的VSX菜单,如果目前您还不了解VSX也没关系,我推荐您先阅读明年我18的文章。
看过基础材料后,感觉Package文件的内容真是多,包括初始化、注册控件、菜单过滤、回调,就算把菜单过滤和回调挪走,一个典型的注册命令代码也有这么多:
OleMenuCommand cmdidFindInSolutionExplorer = new OleMenuCommand(FindInSolutionExplorerCallback,
new CommandID(GuidList.guidConvenientCmdSet, (int)PkgCmdIDList.cmdidFindInSolutionExplorer));
cmdidFindInSolutionExplorer.BeforeQueryStatus += new EventHandler(MenuFilter.ClinicalFilter);
mcs.AddCommand(cmdidFindInSolutionExplorer);
随着插件功能的丰富,百十来个命令让Package文件拥挤不堪,再加上过滤和回调,每次打开这个文件都头皮发麻,(就算把回调和过滤分离成单独文件,大批的回调和过滤函数也。。。)。
下面的解决方案可以让你优雅的注册命令,是读codemaid源码时学到的:
首先定义一个抽象类BaseCommand继承OleMenuCommand,并在BaseCommand下定义两个事件OnBeforeQueryStatus与OnExecute分别对应过滤和回调:
private static void BaseCommand_BeforeQueryStatus(object sender, EventArgs e)
{
BaseCommand command = sender as BaseCommand;
if (command != null)
{
command.OnBeforeQueryStatus();
}
}
protected virtual void OnBeforeQueryStatus()
{
Enabled = true;
}
private static void BaseCommand_Execute(object sender, EventArgs e)
{
BaseCommand command = sender as BaseCommand;
if (command != null)
{
command.OnExecute();
}
}
protected virtual void OnExecute()
{
}
在构造函数中注册事件:
protected ClinicalVSXPackage Pkg { get; private set; }
protected BaseCommand(ClinicalVSXPackage pkg, CommandID id)
: base(BaseCommand_Execute, id)
{
Pkg = pkg;
BeforeQueryStatus += BaseCommand_BeforeQueryStatus;
}
Pkg是将Package类本身传进来,方便传递dte等成员。
这样就可以在Package文件中优雅的注册命令了:
private readonly ICollection<BaseCommand> _commands = new List<BaseCommand>();
private void RegisterCommands()
{
var mcs = MenuCommandService;
if (null == mcs)
return;
_commands.Add(new 命令1(this));
_commands.Add(new 命令2(this));
_commands.Add(new 命令3this));
....
foreach (var command in _commands)
mcs.AddCommand(command);
}
这样当你打算新建一个命令,需要添加一个独立的类继承刚才的BaseCommand
并实现过滤和回调事件,一个典型的命令类:
internal class 命令1 : BaseCommand
{
public 命令1(Package pkg)
: base(pkg, new CommandID(CmdSetID, (int)PkgCmdIDList.命令ID))
{ } protected override void OnBeforeQueryStatus()
{
}
protected override void OnExecute()
{
base.OnExecute();
}
}
VSX规划Package文件的更多相关文章
- Python工程文件中的名词解释---Module与Package的区别
当我们在已有的Python工程文件中创建新的内容是,通常会有两种类型文件供你选择---Module和Package,对于初学者来说会搞不清楚这两种文件直接的关系.这里就来解释一下这两者之间的关系. M ...
- eclipse创建文件package,source folder和folder区别及相互转换
原文:http://blog.csdn.net/u014079773/article/details/66973910 https://www.cnblogs.com/shihaiming/p/735 ...
- eclipse的package, folder, source folder 异同以及相互转化
1 相同点:都是文件夹; 不同点: 我们用面对对象思维来看; 首先说folder, 三者的父类(object),就是普通的文件夹,它和我们window下面使用的文件夹没有任何区别; source fo ...
- folder、source folder、package 区别与联系
在eclipse下,package,source folder,folder都是文件夹. 它们的区别如下: package:当你在建立一个package时,它自动建立到source folder下 ...
- eclipse 下面的folder,source folder,package的区别与作用
首先明确一点,folder,source folder,package都是文件夹,既然是文件夹,那么任何的文件都可以往这三种文件夹下面的放.1.他们的区别folder就是普通的文件夹,它和我们wind ...
- eclipse package,source folder,folder区别及相互转换
今天遇到一个问题:在com.a.b.c这个包路径下建一个package,但是不知为什么就会自动编程folder,而且在这个“package”下的所有property文件读不到.所以看了一下文章:在ec ...
- struts文件上传拦截器中参数的配置(maximumSize,allowedTypes ,allowedExtensions)问题
<interceptor-ref name="fileUpload"> <param name="allowedTypes">image ...
- 搭建本地Nuget服务器并使用NuGet Package Explorer工具打包nuget包
1.什么是Nuget: 百度百科描述: Nuget是 ASP .NET Gallery 的一员.NuGet 是免费.开源的包管理开发工具,专注于在 .NET 应用开发过程中,简单地合并第三方的组件库. ...
- 软件包管理_rpm命令管理_yum工具管理_文件归档压缩_源码包管理
rpm命令管理软件 对于挂载的像U盘那种都会在midea目录下,但是会显示在桌面上 安装软件(i:install,v:verbose冗长的,h:human):rpm -ivh xxxx.rpm 安 ...
随机推荐
- UIImage 相关操作
修改UIImage大小 修改UISlider的最大值和最小值图片的时候,发现需要修改图片的大小,否则会导致UISlider变形.目前苹果还不支持直接修改UIImage类的大小,只能修改UIImageV ...
- 2015年必火的五个Html5移动开发工具推荐
NO.1 DCloudHBuilder:基于HTML5开发工具 中文官网:http://www.dcloud.io/ DCloudHBuilder:基于HTML5开发工具是当前最快的HTML开发工 ...
- ecshop支持手机号码登录、邮箱登录
修改 User.php 文件找到: if ($user->login($username, $password,isset($_POST['remember']))) 在它上边增加一段我们所要 ...
- cocos2d-x Mask的实现及优化
转自:http://blog.ch-wind.com/cocos2d-x%E4%B8%ADmask%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8F%8A%E4%BC%98%E5%8C ...
- IDHttp的基本用法(转)
一.IDHTTP的基本用法 IDHttp和WebBrowser一样,都可以实现抓取远端网页的功能,但是http方式更快.更节约资源,缺点是需要手动维护cook,连接等 IDHttp的创建,需要引入ID ...
- jQuery Mobile的学习 jQuery Mobile工具栏、标题栏、页脚栏的定位学习
程序猿都非常赖.你懂的! 近期在做html5页面的开发,主要做智能终端设备的开发.对于内容比較少的页面,领导提出了要将页眉和页脚定位到网页的最上方和最下方.对于这种要求,事实上一点也只是分.但对于新手 ...
- NopCommerce Html扩展方法Html.Widget
在Nop中有一个Html扩展的类叫HtmlExtensions,主要源码: public static class HtmlExtensions { #region Admin area extens ...
- apache配置--虚拟目录
apache在httpd-vhosts.conf中 配置二级域名或者泛域名: <VirtualHost *:80> ServerAdmin 846606478@qq.com D ...
- 实例源码--Android理财工具源码
下载源码 技术要点: 1.Sqlite数据库的综合使用 2.控件的综合使用 3. 源码带详细的中文注释 ...... 详细介绍: 1. Sqlite数据库的综合使用 本套源码采用了Sqlite ...
- 模板方法模式(Template Method)
@@@模式定义: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. @@@练习示例: 登录控制 @@@示例代码: \s ...