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文件的更多相关文章

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

    当我们在已有的Python工程文件中创建新的内容是,通常会有两种类型文件供你选择---Module和Package,对于初学者来说会搞不清楚这两种文件直接的关系.这里就来解释一下这两者之间的关系. M ...

  2. eclipse创建文件package,source folder和folder区别及相互转换

    原文:http://blog.csdn.net/u014079773/article/details/66973910 https://www.cnblogs.com/shihaiming/p/735 ...

  3. eclipse的package, folder, source folder 异同以及相互转化

    1 相同点:都是文件夹; 不同点: 我们用面对对象思维来看; 首先说folder, 三者的父类(object),就是普通的文件夹,它和我们window下面使用的文件夹没有任何区别; source fo ...

  4. folder、source folder、package 区别与联系

    在eclipse下,package,source folder,folder都是文件夹.  它们的区别如下:  package:当你在建立一个package时,它自动建立到source folder下 ...

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

    首先明确一点,folder,source folder,package都是文件夹,既然是文件夹,那么任何的文件都可以往这三种文件夹下面的放.1.他们的区别folder就是普通的文件夹,它和我们wind ...

  6. eclipse package,source folder,folder区别及相互转换

    今天遇到一个问题:在com.a.b.c这个包路径下建一个package,但是不知为什么就会自动编程folder,而且在这个“package”下的所有property文件读不到.所以看了一下文章:在ec ...

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

    <interceptor-ref name="fileUpload"> <param name="allowedTypes">image ...

  8. 搭建本地Nuget服务器并使用NuGet Package Explorer工具打包nuget包

    1.什么是Nuget: 百度百科描述: Nuget是 ASP .NET Gallery 的一员.NuGet 是免费.开源的包管理开发工具,专注于在 .NET 应用开发过程中,简单地合并第三方的组件库. ...

  9. 软件包管理_rpm命令管理_yum工具管理_文件归档压缩_源码包管理

    rpm命令管理软件 对于挂载的像U盘那种都会在midea目录下,但是会显示在桌面上 安装软件(i:install,v:verbose冗长的,h:human):rpm  -ivh  xxxx.rpm 安 ...

随机推荐

  1. jquery validation ajax 验证

    <link href="${base}/res/basic/css/jquery/validationEngine/validationEngine.jquery.css" ...

  2. 【三支火把】---CDS5516舵机调试以及自己的感想!

    我依然坚持,任何一次自己的心有感触都要及时的记录下来,这样你的努力才是真正的努力. 这两天一直在用STM32调试CDS5516舵机,其实很简单,但是却花了将近两天的时间,过程之曲折我就不说了,先总结一 ...

  3. C#中的强制类型转换与as转换的区别

    C#中的强制类型转换 例如有ClassA与ClassB两个类创建两个类的对象进行转换 1 2 ClassA a = new ClassA();  ClassB b = new ClassB(); 如果 ...

  4. [IoC容器Unity] :Unity预览

    1.引言 高内聚,低耦合成为一个OO架构设计的一个参考标准.高内聚是一个模块或者一个类中成员跟这个模块或者类的关系尽量高,低耦合是不同模块或者不同类之间关系尽量简单. 拿咱国家举例来说,假如你是中国人 ...

  5. 更新插件时提示“正在更新缓存”“正在等待jockey-backend退出”

    Ubuntu 11 更新语言插件, 更新时 提示正在更新缓存”“正在等待jockey-backend退出”,然后就不动了. 解决方案: 在终端中键入ps -e | grep jockey 系统会显示一 ...

  6. material-dialogs

    https://github.com/afollestad/material-dialogs

  7. 如何将松散的dll打包进需要发布的exe

    我们需要发布的exe文件很多时候都可能会依赖于一堆松散的dll,如果想在发布的时候只提供exe文件,而不想把一大堆dll一起放在和exe同一个文件夹下,是有方法的,该方法由CLR via C#作者提出 ...

  8. 用perl对字符串进行全角转半角操作

    #全角转半角 #ljl use Encode; sub CheckSBC { my ($name)=@_; my @character; my $tmpname=$name; my $headname ...

  9. mysql 支持emoji

    1.修改my.cnf [client] default-character-set = utf8mb4 [mysqld] collation-server = utf8mb4_unicode_ci c ...

  10. php 常用正则表达式

    判断“正浮点数”: preg_match('/^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*) ...