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. mysql从一个表中拷贝数据到另一个表中sql语句

    这一段在找新的工作,今天面试时,要做一套题,其中遇到这么一句话,从一个表中拷贝所有的数据到另一个表中的sql是什么? 原来我很少用到,也没注意过这个问题,面试后我上网查查,回来自己亲手写了写,测试了下 ...

  2. ADUM1201在隔离RS232中的应用 【瓦特芯收藏】

    ADUM1201在隔离RS232中的应用 引言: RS-232是PC机与工业通信中应用最广泛的一种串行接口.RS-232接口最初是由美国EIA(电子工业联合会)规定的用于计算机与终端设备之间通讯的一种 ...

  3. POJ 1679 The Unique MST (次小生成树)

    题目链接:http://poj.org/problem?id=1679 有t组数据,给你n个点,m条边,求是否存在相同权值的最小生成树(次小生成树的权值大小等于最小生成树). 先求出最小生成树的大小, ...

  4. CF:322D - Ciel and Duel 贪心 或者 DP 我用的贪心 。。难道sort跟qsort是不一样的么?

    D. Ciel and Duel time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  5. IIS支持其他类型下载

    路径:IIS--默认网站属性-->http 头-->MIME映射 -->文件类型 -->新类型

  6. 谈谈C#基元类型

    首先看一下.NET 中的基元类型,如下表: C# Type | .NET Framework Type -------------| ---------------------- bool | Sys ...

  7. 【转】Installing the libv8 Ruby gem on Centos 5.8

    转自:http://appsintheopen.com/posts/18-installing-the-libv8-ruby-gem-on-centos-5-8 First, Centos 5.8 s ...

  8. VS2015创建的Asp.net WebApi默认项目在CentOS7+Mono4.2.2+jexus5.8运行不起来的解决方案

    主要原因是Web.config配置的问题. 修改成如下内容: <?xml version="1.0" encoding="utf-8"?> < ...

  9. 批量导出表数据到CSV文件

    需求:把oracle数据库中符合条件的N多表,导出成csv文本文件,并以表名.csv为文件名存放. 实现:通过存储过程中UTL_FILE函数来实现.导出的csv文件放入提前创建好的directory中 ...

  10. java 覆盖hashCode()深入探讨 代码演示样例

    java 翻盖hashCode()深入探讨 代码演示样例 package org.rui.collection2.hashcode; /** * 覆盖hashcode * 设计HashCode时最重要 ...