上篇介绍了RegionAdapter的作用及如何如何扩展RegionAdapter的方法.
这篇向大家介绍一个在wpf中非常实用的功能Attach Behavior.我们称之为附加行为.
附加行为在Web领域的流行
如果你知道asp.net ajax框架就一定会知道AJAX Control Toolkit.虽然里面的很多功能华而不实,但这种实现方式确实非常值得学习.你可以再次打开其展示的网站回顾一下其用法,如下面代码的方式
<asp:TextBox ID="TextBox1" runat="server" /> <sample:FocusBehavior runat="server" ID="FocusBehavior1" HighlightCssClass="MyHighLight" NoHighlightCssClass="MyLowLight" TargetControlID="TextBox1" />
在这里发几句牢骚,ajaxControlToolKit一个简单的功能,需要依赖于多个基类,光谈设计没问题, 但必须考虑到,我们是在做web,尽量不要加载不必要的脚本文件,在你使用其提供的日历扩展时,你就会发展其脚本无比大.而且功能不易扩展.我曾经看过一些商业控件,也是基于asp.net ajax的.因为面向对象的设计,一个控件的脚本能加载到300k左右.这不知道该怪控件开发者还是框架设计者呢?我想还是因为web的特性关系,让我们放不开手脚在javascript上做面向对象,做到适用即可.
如果你用过jQuery的话,那么它的小巧和易扩展性你是绝对可以感受到的,你是否有曾经一段时间在网上疯狂的找jQuery插件的经历呢?
jQuery插件其实就等同于asp.net ajax的行为扩展(Behavior),两个框架的扩展行为数量并不是一个数量级的.所以jQuery对于大多数人来讲是非常好的选择.
附加行为在wpf的使用
行为是一个组件,它扩展与其关联的 DOM 元素的功能。这是asp.net ajax框架的行为的一种解释.
那么套用在wpf上,则是行为是一个组件,它扩展与其关联的元素(也可称控件)的功能
附加行为是一种模式,与附加属性不同,但它的实现方式可以借助附加属性的方式.如下示例
<fxui:TextBox x:Name="searchTextBox" Margin="2" Grid.Column="1"> <fxui:Interaction.Behaviors> <fxui:AutoCommit ButtonName="searchButton" /> </fxui:Interaction.Behaviors> </fxui:TextBox>
这个扩展是nikhilk在silverlight使用附加行为的模式做了一个扩展.你可以参考他写的关于Behavior的文章,同时也可以参考另外一篇文章.
nikhilk(牛人啊…)扩展的silverlight类库很有参考价值,大家可以下载作为学习.
Interaction.Behaviors是一个包含附加行为结合的附加属性,AutoCommit 是一个扩展的附加行为
让我们来看一下Behavior的基础设计,Behavior定义了两个方法,OnAttach方法就是扩展关联元素的功能,OnDetach则取消相关联元素的扩展功能.当Behavior添加到BehaviorCollection集合内时则触发OnAttach方法,移除的时候则触发OnDetach方法.这便是附加行为的基本使用方法了。
附加行为在prism框架中的使用
在Bootstrapper引导程序中,prism默认注册了一些附加行为,其是通过一个名为IRegionBehaviorFactory的简单的工厂类实现的.默认附加行为如下,你也可以通过重写Bootstrapper的ConfigureDefaultRegionBehaviors方法扩展prism框架的默认附加行为.
protected virtual IRegionBehaviorFactory ConfigureDefaultRegionBehaviors() { var defaultRegionBehaviorTypesDictionary = Container.TryResolve<IRegionBehaviorFactory>(); if (defaultRegionBehaviorTypesDictionary != null) { defaultRegionBehaviorTypesDictionary.AddIfMissing(AutoPopulateRegionBehavior.BehaviorKey, typeof(AutoPopulateRegionBehavior)); defaultRegionBehaviorTypesDictionary.AddIfMissing(BindRegionContextToDependencyObjectBehavior.BehaviorKey, typeof(BindRegionContextToDependencyObjectBehavior)); defaultRegionBehaviorTypesDictionary.AddIfMissing(RegionActiveAwareBehavior.BehaviorKey, typeof(RegionActiveAwareBehavior)); defaultRegionBehaviorTypesDictionary.AddIfMissing(SyncRegionContextWithHostBehavior.BehaviorKey, typeof(SyncRegionContextWithHostBehavior)); defaultRegionBehaviorTypesDictionary.AddIfMissing(RegionManagerRegistrationBehavior.BehaviorKey, typeof(RegionManagerRegistrationBehavior)); } return defaultRegionBehaviorTypesDictionary; }
在上篇介绍RegionAdapter的时候,我们还有一些问题没有回答,现在可以来消除这些疑问了
IRegion有一个Behaviors集合,我们再来看一遍RegionAdapter其中的Initialize方法
public IRegion Initialize(T regionTarget, string regionName) { if (regionName == null) throw new ArgumentNullException("regionName"); IRegion region = CreateRegion(); region.Name = regionName; SetObservableRegionOnHostingControl(region, regionTarget); Adapt(region, regionTarget); AttachBehaviors(region, regionTarget); AttachDefaultBehaviors(region, regionTarget); return region; }
AttachDefaultBehaviors方法会把prism框架默认注册的附加行为,添加到IRegion的行为集合里面,同时你也可以通过重写AttachBehaviors方法,扩展IRegion的功能.以下是AttachDefaultBehaviors方法的实现
protected virtual void AttachDefaultBehaviors(IRegion region, T regionTarget) { IRegionBehaviorFactory behaviorFactory = this.RegionBehaviorFactory; if (behaviorFactory != null) { DependencyObject dependencyObjectRegionTarget = regionTarget as DependencyObject; foreach (string behaviorKey in behaviorFactory) { if (!region.Behaviors.ContainsKey(behaviorKey)) { IRegionBehavior behavior = behaviorFactory.CreateFromKey(behaviorKey); if (dependencyObjectRegionTarget != null) { IHostAwareRegionBehavior hostAwareRegionBehavior = behavior as IHostAwareRegionBehavior; if (hostAwareRegionBehavior != null) { hostAwareRegionBehavior.HostControl = dependencyObjectRegionTarget; } } region.Behaviors.Add(behaviorKey, behavior); } } } }
也就是说IRegion的功能由全局的附加行为和自定义的附加行为组成的.这个附加行为的特性就给IRegion的扩展留下了很大的空间.我们要了解IRegion还提供了什么功能,可以先了解下默认注册的这些附加行为.
关于prism框架提供的这些默认的附加行为,可以参考prism框架设计者的一篇文章.其实在prism框架可以看到nikhilk扩展的那个silverlight类库的一些影子.这种模式可能在以后框架的发展中用的越来越多.
好了,这篇就介绍到这里,希望大家对附加行为有一个基本的认识.
发表评论
-
wpf开发常见问题(1)
2008-10-22 21:42 1535经过一段时间wpf的学习和实际开发.现在与大家分享 ... -
初始化集合项依赖属性
2008-11-03 13:38 787在wpf自定义属性时,若此属性为集合类型的话,如 ... -
WPF and SL RadioButtonList Tip
2008-11-03 14:03 778在以下情境下.使用数据绑定分离UI与后端Model ... -
wpf datagrid笔记 part 1
2008-12-10 23:35 28561,基本属性 开关基本 ... -
Prism V2之旅(2)
2009-01-07 10:02 1114本篇将介绍Prism中Region的使用. 本篇D ... -
Prism V2之旅(3)
2009-01-07 15:24 812上篇介绍了Region的基本应用,这篇接上篇,继续介绍 ... -
Prism V2之旅(5)
2009-01-13 11:54 1058上篇介绍了WPF的Attach Behavior(附加行 ... -
Prism V2之旅(6)
2009-01-13 15:14 993这篇来讲事件.事件主要用来交互. 监听事件 我订 ... -
prism v2之旅(7)
2009-01-15 23:53 1104这篇继续介绍Module的功能. 第5篇已经介绍过模块的 ... -
XAML Guidelines
2009-01-17 11:31 790http://blogs.msdn.com/jaimer ... -
wpf中xaml的类型转换器与标记扩展
2009-02-02 14:03 2284这篇来讲wpf控件属性的类型转换器 类型转换器 类 ... -
wpf控件设计时支持(3)
2009-02-02 14:12 2741wpf设计时调试 编辑模型 装饰器 1.wpf ... -
wpf控件样式管理示意图
2009-02-04 14:40 1599...
相关推荐
Prism中文文档,完美的prism简介
WPF Prism
Silverlight Prism 4框架文档
Prism4 Demo程序,是一个非常不错的入门示例,上手快
项目演示了如何基于 MEF 框架在 Prism 4 中使用。
4. Run C:\Program Files\Embarcadero\Delphi Prism\Bin\LicenseManager.exe 5. Selete the menu item "License\Import",import C:\Program Files\Embarcadero\Delphi Prism\License\PrismXe.slip 6. exit and save....
prism模板 vs插件
prism4的参考手册 英文版本 可以作为学习和参考资料
1、Prism各个重要概念实例 2、MVVM架构 3、WPF中使用Prism
Prism经典案例
Prism系列之模块化
Prism是由微软Patterns & Practices团队开发的项目,目的在于帮助开发人员构建松散耦合的、更灵活、更易于维护并且更易于测试的WPF应用或是Silverlight程序.
C#+WPF+Prism模块化开发示例。本示例简述了Prism框架的基本应用,包括数据绑定,事件等内容
WPF Prism 依赖注入实现可关闭的TabControl。
MVVM PRISM DEMOMVVM PRISM DEMOMVVM PRISM DEMOMVVM PRISM DEMOMVVM PRISM DEMOMVVM PRISM DEMOMVVM PRISM DEMOMVVM PRISM DEMO
prism quickstart
developer's guid to microsoft prism building mvvm and modular applications with wpf and silverlight
VS2022的在线插件库中未收录PrismTemplate插件,导致无法直接在VS中安装Prism模板插件。 该插件基于官网插件修改安装支持版本后,可直接安装使用(电脑只有VS2022)。 如果电脑有多版本VS,需要右键在打开方式中选择...
prism对话服务
Demo.Prism40。