上篇介绍了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 1599经过一段时间wpf的学习和实际开发.现在与大家分享 ... -
初始化集合项依赖属性
2008-11-03 13:38 821在wpf自定义属性时,若此属性为集合类型的话,如 ... -
WPF and SL RadioButtonList Tip
2008-11-03 14:03 810在以下情境下.使用数据绑定分离UI与后端Model ... -
wpf datagrid笔记 part 1
2008-12-10 23:35 29181,基本属性 开关基本 ... -
Prism V2之旅(2)
2009-01-07 10:02 1182本篇将介绍Prism中Region的使用. 本篇D ... -
Prism V2之旅(3)
2009-01-07 15:24 865上篇介绍了Region的基本应用,这篇接上篇,继续介绍 ... -
Prism V2之旅(5)
2009-01-13 11:54 1110上篇介绍了WPF的Attach Behavior(附加行 ... -
Prism V2之旅(6)
2009-01-13 15:14 1040这篇来讲事件.事件主要用来交互. 监听事件 我订 ... -
prism v2之旅(7)
2009-01-15 23:53 1145这篇继续介绍Module的功能. 第5篇已经介绍过模块的 ... -
XAML Guidelines
2009-01-17 11:31 859http://blogs.msdn.com/jaimer ... -
wpf中xaml的类型转换器与标记扩展
2009-02-02 14:03 2347这篇来讲wpf控件属性的类型转换器 类型转换器 类 ... -
wpf控件设计时支持(3)
2009-02-02 14:12 2780wpf设计时调试 编辑模型 装饰器 1.wpf ... -
wpf控件样式管理示意图
2009-02-04 14:40 1663...
相关推荐
Prism4 Demo程序是针对微软WPF(Windows Presentation Foundation)框架的一个示例应用,它展示了Prism库的用法。Prism是一个强大的开发框架,专为构建可维护、可扩展和模块化的WPF和UWP应用程序而设计。该框架由...
在Prism 4.0中,`Prismv4.exe`是安装程序,用于在开发环境中安装所需的类库和工具。一旦安装完成,开发者就可以在项目中引用Prism提供的类库,利用其特性来构建高效、易于维护的MVVM应用程序。对于Desktop、...
Prism是一个流行的框架,它可以帮助开发者构建适用于.NET平台的模块化应用程序。本手册介绍的是Prism框架的官方指南,并说明了如何将Markdown文件转换成PDF格式。Prism框架主要针对WPF(Windows Presentation ...
Prism4是一个强大的框架,由微软的Patterns & Practices团队精心设计,旨在简化Windows Presentation Foundation (WPF)和Silverlight应用程序的开发。这个框架的核心理念是推动松散耦合,这在软件工程中是一个极其...
Prism 是一个开源的软件开发框架,主要用于构建模块化、可扩展且遵循最佳实践的 WPF 和 Silverlight 应用程序。Prism 提供了一系列设计模式、库和工具,帮助开发者更容易地创建遵循 Microsoft .NET 指南的复杂应用...
在 "Prism4MefDemo" 这个项目中,我们可以期待看到以下内容: 1. **模块(Module)**: 模块是应用的基本组成部分,每个模块可能包含一个或多个视图和视图模型,以及相关的服务。它们可以通过 MEF 导出,然后在运行...
Silverlight Prism 4框架文档
1. **模块化(Modularity)**:Prism的核心特性之一是模块化,它允许将大型应用程序分解为小的、独立的模块,每个模块都有自己的功能。这样可以提高代码的可重用性,使得开发和维护变得更加容易。在示例中,你可能会...
4. **命令(Commands)**:Prism支持定义和实现UI无关的命令,使得业务逻辑与视图解耦。 5. **导航服务(Navigation Service)**:在MVVM架构中,Prism提供导航服务,用于在视图之间跳转,支持参数传递和历史管理。...
Prism 的核心特性之一是模块化。模块化允许将大型应用程序分解为小的、独立的功能单元,每个单元称为模块。这样可以分别开发、测试和部署这些模块,提高代码的复用性和可维护性。文件名 "Prism-7.2.0.1422" 可能包含...
prism模板 vs插件
prism4的参考手册 英文版本 可以作为学习和参考资料
4. **事件总线(EventAggregator)**:Prism 中的事件总线允许不同层或模块之间通信,而无需直接引用。这对于松散耦合的组件间通信非常有用,确保各组件独立可测试。 5. **模块化(Modularity)**:Prism 支持模块...
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....
在本文中,我们将深入探讨如何在WPF应用中利用Prism框架实现一个可关闭的TabControl。WPF(Windows Presentation Foundation)是.NET Framework的一部分,提供了一种强大的方式来构建丰富的、具有图形用户界面的应用...
4. **ViewModels**:每个视图都有相应的视图模型,实现了MVVM模式,通过数据绑定将视图与数据连接起来。 5. **Views**:这些是WPF XAML文件,定义了用户界面的布局和控件。 6. **Bootstrapper**:初始化Prism框架...
GraphPad Prism 5.0 中文教程 GraphPad Prism 5.0 是一个功能强大的数据分析和图形化工具,它可以帮助用户快速、准确地处理和可视化数据。在本教程中,我们将详细介绍 GraphPad Prism 5.0 的使用方法和技巧,从...
GraphPad Prism 是一个包括基础生命统计、曲线匹配和科学作图的强大结合体。在一百多个国家有超过 10 万个科学家正在试用 Prism 来分析、绘图和呈现他们的科学数据。 是什么令许多世界上领先的大学、医学中心、研究...
4. **命令**:Prism提供了命令机制,使得在ViewModel中处理用户操作更加方便,同时保持了View与ViewModel的分离。 5. **导航服务**:在WPF应用中,Prism提供了导航服务,使得页面间的跳转和参数传递变得简单。 6. ...