WPF外包WIN8外包HTML5外包就找北京动点飞扬:WPF 4.5探秘之六 事件的标记扩展
2012-10-12 13:38
323 查看
本篇文章是WPF 4.5新特征系列的一部分,我们将一起探秘WPF 4.5里“事件的标记扩展”。
标记扩展是什么?用在什么场景?
正如 Rob 指出,对于在XAML 中的标记扩展可以提供值。在这种情况下,也会提供一个委托,WPF 框架本身并不定义要用于事件的标记扩展。
在我看来,这个特性将使用新的场景。事实上,对于某些人创建这样的扩展场景是一种梦想,就是在空间上引发事件时触发一个动作。除了记住哪个命名空间中添加 和使用行为与触发,开发人员只需要创建一个标记扩展,就像他将创建一个转换器。当然有一个最主要的缺点:不支持混合。如果你也样是一个Blend的粉丝, 你就会继续使用behavior/trigger,因为它只需要简单拖拽即可。因此,很多人觉得它不会过时,这依旧是一个指的记住的好特性和选择。
如何使用标记扩展?
这次,很明显不能像WPF的其他特性一样的使用。
作为一个标记扩展,一个类继承了标记扩展,并实现抽象为ProvideValue方法。这就是所谓的框架,它提供了一个IServiceProvider的对象作为参数。
这serviceProvider是一个依赖解析器,你可以使用它来获取一个命名IProvideValueTarget的服务,然后会被用来获取属性的MarkupExtension (你可以得到它的目标对象)的目标。
这个属性是事件活动的访问器(当你订阅的时候会用“+ =”语法来调用它)。这时,反射会被用来找到目标事件的处理程序的类型。
一旦做到了这点,就会创建一个Delegate和由这个MarkupExtension所提供的返回值。在接下来的例子里面,delegate处理程序是 一个被命名为“MyMarkupExtensionInternalHandler”的方法,定义在标记扩展本身里。
public override object ProvideValue(IServiceProvider serviceProvider)
{
IProvideValueTarget targetProvider = serviceProvider
.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
if (targetProvider == null)
throw new InvalidOperationException(@"The CallAction extension
can't retrieved the IProvideValueTarget service.");
var targetEventAddMethod = targetProvider.TargetProperty as MethodInfo;
//Retrieve the handler of the event
ParameterInfo[] pars = targetEventAddMethod.GetParameters();
Type delegateType = pars[1].ParameterType;
//Retrieves the method info of the proxy handler
MethodInfo methodInfo = this.GetType()
.GetMethod("MyMarkupExtensionInternalHandler",
BindingFlags.NonPublic | BindingFlags.Instance);
//Create a delegate to the proxy handler on the markupExtension
Delegate returnedDelegate = Delegate
.CreateDelegate(delegateType, this, methodInfo);
return returnedDelegate;
}
void MyMarkupExtensionInternalHandler(object sender, EventArgs e)
{
//here something can be performed.
}
当你创建你的标记扩展的时候,必须知道的一些事:
1、 当有坏的事情发生了,抛掉 InvalidOperationException,
2、 不要认为所有的事情都已经初始化了:当然不是,特别是对于目标的数据文件。
3、 常常检查你检索的不为空的对象,特别是通过 IServiceProvider 参数而获得的服务。
标记扩展是什么?用在什么场景?
正如 Rob 指出,对于在XAML 中的标记扩展可以提供值。在这种情况下,也会提供一个委托,WPF 框架本身并不定义要用于事件的标记扩展。
在我看来,这个特性将使用新的场景。事实上,对于某些人创建这样的扩展场景是一种梦想,就是在空间上引发事件时触发一个动作。除了记住哪个命名空间中添加 和使用行为与触发,开发人员只需要创建一个标记扩展,就像他将创建一个转换器。当然有一个最主要的缺点:不支持混合。如果你也样是一个Blend的粉丝, 你就会继续使用behavior/trigger,因为它只需要简单拖拽即可。因此,很多人觉得它不会过时,这依旧是一个指的记住的好特性和选择。
如何使用标记扩展?
这次,很明显不能像WPF的其他特性一样的使用。
作为一个标记扩展,一个类继承了标记扩展,并实现抽象为ProvideValue方法。这就是所谓的框架,它提供了一个IServiceProvider的对象作为参数。
这serviceProvider是一个依赖解析器,你可以使用它来获取一个命名IProvideValueTarget的服务,然后会被用来获取属性的MarkupExtension (你可以得到它的目标对象)的目标。
这个属性是事件活动的访问器(当你订阅的时候会用“+ =”语法来调用它)。这时,反射会被用来找到目标事件的处理程序的类型。
一旦做到了这点,就会创建一个Delegate和由这个MarkupExtension所提供的返回值。在接下来的例子里面,delegate处理程序是 一个被命名为“MyMarkupExtensionInternalHandler”的方法,定义在标记扩展本身里。
public override object ProvideValue(IServiceProvider serviceProvider)
{
IProvideValueTarget targetProvider = serviceProvider
.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
if (targetProvider == null)
throw new InvalidOperationException(@"The CallAction extension
can't retrieved the IProvideValueTarget service.");
var targetEventAddMethod = targetProvider.TargetProperty as MethodInfo;
//Retrieve the handler of the event
ParameterInfo[] pars = targetEventAddMethod.GetParameters();
Type delegateType = pars[1].ParameterType;
//Retrieves the method info of the proxy handler
MethodInfo methodInfo = this.GetType()
.GetMethod("MyMarkupExtensionInternalHandler",
BindingFlags.NonPublic | BindingFlags.Instance);
//Create a delegate to the proxy handler on the markupExtension
Delegate returnedDelegate = Delegate
.CreateDelegate(delegateType, this, methodInfo);
return returnedDelegate;
}
void MyMarkupExtensionInternalHandler(object sender, EventArgs e)
{
//here something can be performed.
}
当你创建你的标记扩展的时候,必须知道的一些事:
1、 当有坏的事情发生了,抛掉 InvalidOperationException,
2、 不要认为所有的事情都已经初始化了:当然不是,特别是对于目标的数据文件。
3、 常常检查你检索的不为空的对象,特别是通过 IServiceProvider 参数而获得的服务。
相关文章推荐
- WPF外包公司 — WPF外包咨询 北京动点飞扬软件 WPF 4.5探秘之一 异步数据验证
- WPF外包就找北京动点飞扬软件:WPF 4.5探秘之三 Dispatcher的新方法
- WPF外包就找北京动点飞扬 — WPF 4.5探秘之二 改进WeakEventManager
- WPF外包公司——北京动点飞扬软件联系方式和官方博客地址
- WPF外包公司—北京动点飞扬软件:WPF技术分享—Prism V2之旅(1)
- WPF项目外包就找北京动点飞扬(长期有效,可签公司合同)
- WPF外包——北京动点飞扬软件:微软即将打响“三大战役”
- WPF外包公司——北京动点飞扬软件:开发企业WPF项目需要掌握些什么
- WPF外包公司 — WPF外包就找北京动点飞扬软件
- WPF外包——就找北京动点软件:微软盖茨首次表态:Windows 8非常棒!
- Kinect外包-就找北京动点飞扬软件(长年承接微软Kinect体感项目外包,有大型Kinect案例)
- WPF外包公司 — 北京动点WPF外包咨询:微软将依靠kincet for Windows和Surface为代表的新硬件产品征服中国市场
- U3D外包、Unreal4外包、VR外包就找北京动点飞扬软件
- 微信公共平台外包就找北京动点飞扬软件,长年承接微软公共平台项目外包
- 微信公共平台外包公司-北京动点飞扬软件,承接微软公共平台项目外包
- WP8外包公司就找北京动点飞扬软件,正规公司长年承接Windowsphone8(WP8外包)
- WPF外包公司 — 北京动点飞扬软件 WPF 4.5探秘之四 新绑定延迟属性
- WP8外包&Windowsphone8外包就找北京动点飞扬软件,正规公司!长期有效!
- Silverlight外包公司—北京动点飞扬:Win8就是牛,刚接受预订就登亚马逊畅销榜首位
- windowsphone8外包就找北京动点飞扬软件,正规公司可签合同,保证工期!