SharpDevelop学习笔记(5)—— AddIns系统详解
在所有的插件被加载到指定的扩展点后,插件树就被创建完毕了,
但是,我们知道,插件树创建后,每个插件在插件树的位置在就固定的,但是,如果某些情况下,我们希望一些插件不可使用或应该隐藏起来,
或者说有的插件在一些特定的情况下才是有意义的,
比如在Designtime下,只有我们选中了一个Component后,删除按钮才应该起作用,否则删除按钮应该是Disable的或不可见得,这种情况下我们
不可能去修改插件树,那应该如何做呢?
当然如果我们每次在选中或取消选中一个Component都去更新按钮的状态,理论上也是可以的,
这里我说“理论上”,是因为我没有成功过,让我们SD中的一个实际的Codon:
<Path name = "/SharpDevelop/Pads/ProjectBrowser/ToolBar/File">
<ToolbarItem id = "OpenFile"
icon = "Icons.16x16.OpenFileIcon"
tooltip = "${res:Gui.ProjectBrowser.Open}"
class = "ICSharpCode.SharpDevelop.Project.Commands.OpenFileFromProjectBrowser"/>
</Path>
上面的意图很简单,就是在ToolBar上放一个打开文件的一个ToolbarItem,SD启动后,你也看到这个ToolbarItem确实在呢,
但问题是:这个ToolbarItem的对象是访问不到的,至少我是没有办法访问到它,因为SD中这个一个ToolbarItem只是代表一个Command,
你点击它时,它就去创建它对应的Command,然后执行一下Run()函数,而且我花了几天时间查SD的代码,也没有发现能够取到这个对象的。
好吧,这是一个长话题,我就不多说了,不过即使能访问到,最好也不应该这样做,因为这样会使你的代码混乱。
让我们看看SD中如何解决这个问题的吧,其实很简单,SD中定义了一个叫做ConditionEvaluator的东西,
你可以根据自己的需求来控制插件的Enable或Visiable的状态,多个ConditionEvaluator进行与、或操作时还是有的麻烦的,
让我们从一个简单的例子开始吧。
假如我们有一开始就提到的需求:只有我们选中了一个Component后,删除按钮才应该起作用。
三步搞定:
第一步:
先写一个类,实现我们的控制逻辑
namespace AddIns
{
public class DesignerHostOpenCondition : IConditionEvaluator
{
#region IConditionEvaluator Members
public bool IsValid(object caller, Condition condition)
{
ICollection result = GetSelectedComponents();
return result.Count >0;
}
ICollection GetSelectedComponents()
{
//...
//your logic here...
}
}
}
这个类必须实现IConditionEvaluator接口,我们的代码很简单,在选择的Component个数大于0时,返回True。
然后编译它到"HostAddin.dll"文件中。
第二步:
注册我们的DesignerHostOpenCondition ,
我们知道在每个插件中都有一个<Runtime>标签,像这样注册我们的DesignerHostOpenCondition:
<Runtime>
<Import assembly = "HostAddin.dll">
<ConditionEvaluator name="DesignerHostOpen" class="AddIns.DesignerHostOpenCondition"/>
</Import>/>
</Runtime>
上面的XML很容易理解,这里我们给它指定一个唯一名字为“DesignerHostOpen”,这样别的地方可以引用它。
第三步:
使用"DesignerHostOpen",在你需要控制的MenuItem或ToolBarItem上,如下方式使用:
Codon如下:
<Path name = "/SharpDevelop/Workbench/ViewContent/ContextMenu/HostControl">
<Condition name = "DesignerHostOpen" action="Exclude">
<MenuItem id = "Delete Selected"
label = "${res:Global.RemoveButtonText}"
icon = "Icons.16x16.DeleteIcon"
shortcut ="Delete"
class = "AddIns.DeleteCommand" />
</Condition>
</Path>
你会发现我们的MenuItem被一个<Condition> 包起来了,其实里面可以包多个项表示这个"DesignerHostOpen"对那几个Item有效。
要注意的是其中的:action="Exclude",action 可以有三个值,其余的两个是:Disable(控制当条件不满足时应该把MenuItem变成Disable)
、None(这个没有用,SD中似乎也没有用它的,而我们指定的"Exclude"会在条件不满足时让MenuItem变成不可见。
ok,运行程序,你就发现真的可以了。
工作机制很简单,SD会挂Appliction.Idle事件,大家知道在系统没有消息处理时就会出发这个事件,
而SD就是在这个事件里去尝试检查每个ConditionEvaluator的
SharpDevelop学习笔记(5)—— AddIns系统详解的更多相关文章
- IP2——IP地址和子网划分学习笔记之《子网掩码详解》
2018-05-04 16:21:21 在学习掌握了前面的<进制计数><IP地址详解>这两部分知识后,要学习子网划分,首先就要必须知道子网掩码,只有掌握了子网掩码这部分内容 ...
- [读书笔记]C#学习笔记三: C#类型详解..
前言 这次分享的主要内容有五个, 分别是值类型和引用类型, 装箱与拆箱,常量与变量,运算符重载,static字段和static构造函数. 后期的分享会针对于C#2.0 3.0 4.0 等新特性进行. ...
- CDN学习笔记二(技术详解)
一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精华放上网.公诸同 ...
- C#学习笔记二: C#类型详解
前言 这次分享的主要内容有五个, 分别是值类型和引用类型, 装箱与拆箱,常量与变量,运算符重载,static字段和static构造函数. 后期的分享会针对于C#2.0 3.0 4.0 等新特性进行. ...
- 【Java学习笔记之三十三】详解Java中try,catch,finally的用法及分析
这一篇我们将会介绍java中try,catch,finally的用法 以下先给出try,catch用法: try { //需要被检测的异常代码 } catch(Exception e) { //异常处 ...
- MyBatis学习笔记2--配置环境详解
1.MyBatis-config.xml详解 一个完整的配置文件如下所示 <configuration> <!-- <properties resource="jdb ...
- jQuery学习笔记之Ajax用法详解
这篇文章主要介绍了jQuery学习笔记之Ajax用法,结合实例形式较为详细的分析总结了jQuery中ajax的相关使用技巧,包括ajax请求.载入.处理.传递等,需要的朋友可以参考下 本文实例讲述了j ...
- [Spring学习笔记 5 ] Spring AOP 详解1
知识点回顾:一.IOC容器---DI依赖注入:setter注入(属性注入)/构造子注入/字段注入(注解 )/接口注入 out Spring IOC容器的使用: A.完全使用XML文件来配置容器所要管理 ...
- CSS学习笔记(9)--详解CSS中:nth-child的用法
详解CSS中:nth-child的用法 前端的哥们想必都接触过css中一个神奇的玩意,可以轻松选取你想要的标签并给与修改添加样式,是不是很给力,它就是“:nth-child”. 下面我将用几个典型的实 ...
- ubuntu学习笔记-tar 解压缩命令详解(转)
tar 解压缩命令详解 -c: 建立压缩档案 -x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能 ...
随机推荐
- 在myeclipse下安装svn的几种方式
方法一:在线安装 1.打开HELP->MyEclipse Configuration Center.切换到SoftWare标签页. 2.点击Add Site 打开对话框,在对话框Name输入Sv ...
- React 快速入门小记
大约半个月前,我一直在思考一个问题,Angular.React 和 Vue,究竟该学什么? 听取了几位前辈的意见,也综合考虑了各方面的原因,最终选择了 React,希望我"没有选错" ...
- Ubuntu 和 Redhat / Fedora 服务管理命令对比表(附Fedora16新的服务管理工具systemctl )
以 apache/httpd 服务作为例子 任务 Red Hat / Fedora Ubuntu Ubuntu (with sysv-rc-conf or sysvconfig) 立即启动/停止某服务 ...
- mac系统安装node
1.node 是通过brew来安装的,所以第一步先安装brew ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebre ...
- Android自定义View的三种实现方式
在毕设项目中多处用到自定义控件,一直打算总结一下自定义控件的实现方式,今天就来总结一下吧.在此之前学习了郭霖大神博客上面关于自定义View的几篇博文,感觉受益良多,本文中就参考了其中的一些内容. 总结 ...
- qq加好友加群限制ip怎么解决
目前各样格式的推广都会用到腾讯QQ,现在就遇到了问题.QQ加好友加群,经常会提示你的账号存在不安全因素,暂停加好友功能.这个原因都是本地同一个IP,登陆的QQ过多,加好友过多.导致这个IP被记录,相当 ...
- OneSQL安装
下载 www.onexsoft.com -> 下载 -> OneSQL 安装 yum install onesql-<version>.rpm 配置 进入安装目录 cd /us ...
- mysql timestamp类型字段的CURRENT_TIMESTAMP与ON UPDATE CURRENT_TIMESTAMP属性
timestamp有两个属性,分别是CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP两种,使用情况分别如下: 1.CURRENT_TIMESTAMP 当要向 ...
- appium 1.6.3+Xcode运 For Mac
1. 下载两个版本的Xcode, Xcode 1.7.3 与Xcode 8.2 ,放置在不同的目录下.进入terminal, 选择需要的版本: sudo xcode-select -switch // ...
- kafka 搭建与使用
消息量非超级多不建议使用,可以使用redis或Beanstalkd 使用简单 Beanstalkd 客户端建议用:composer require pda/pheanstalk 如果无JAVA JDK ...