




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
从WPF的AttachProperty到Sliverlight3中的Behavior 周银辉说来很巧,最早接触到Behavior模式不是在Sliverlight中,而是我们在使用“Prism+MVVM”试图将界面和后台逻辑尽可能脱耦时,那时我们发现虽然WPF的Command、Prism的DelegateCommand能很好地帮助我们脱耦,但WPF的Command数量太少(比如Button的Command对应的是Click事件,但如果我需要在Loaded时也使用Command,其就无能为力了),于是我们用到了一个称为Behavior的模式来协助我们解决,不过当时我们总习惯哈哈大笑,因为我们认为这是一个很龌龊的技巧。如果还要向前追溯的话,那就得到很久以前了,当时我发现WPF拥有一个能力是将某个属性“附加(Attach)”到某个对象上,也就是Attach Property,那么我们能否用相同的原理将某个功能也附加到某个的对象上呢?可以的,这就是Attached Behavior,在当时我一直觉得这仅仅是一个小技巧,因为我从来只用它来为同事的代码增加功能或修改Bug,同事在用我写的功能函数时,感觉是在给对象打插件,非常方便。前几天,听说MS将其纳入到Sliverlight3中了,颇感惊异。1,从Attach属性开始在继续阅读之前,建议下载Demo程序,并先看看源代码从上面的代码看,你是不是可以猜到loc:InfoService.Info是一个AttachProperty,我们将一个字符串Attach到了一个Button控件上。恩,你的猜想是可行的,也是一般做法,但这里我们并不想这么做,看看我是怎么做的: publicstaticclassInfoServiceprivatestaticHashtableinfoCache=newHashtable();publicstaticvoidSetInfo(Objectobj,Objectinfo)if(infoCache.Contains(obj)infoCacheobj=info;elseinfoCache.Add(obj,info);publicstaticObjectGetInfo(Objectobj)if(infoCache.Contains(obj)Console.WriteLine(getvaluefromcustomcache);returninfoCacheobj;returnnull;注意到了吗?InfoService并不包含任何AttachProperty,甚至Info属性都没有。能编译通过吗?不仅能编译,而且能很好地工作。为什么?我不能说这是技巧,我只能说这是MS的Xaml解析器玩的花招。当Xaml解析器发现myNamespace:MyClass.MyAttachProperty时,其并不会真正的去查找和调用MyClass.MyAttachProperty属性,而是会去看MyClass类中是否存在SetMyAttachProperty(arg1, arg2)方法,如果存在则将被Attach的对象作为arg1,Attach的属性值作为arg2,然后去调用SetMyAttachProperty方法,如果不存在,则报异常说“不存在MyDP这样的AttachProperty。按属性值被存放在上面地方了,WPF会为AttachProperty做一个缓存表,对属性值的查找和设置都在这个缓存表中进行(也就是DependencyObject的GetValue和SetValue两个方法所干的事情)。所以,上面的代码中,我们自己用Hashtable做了一个简易的缓存表,属性值便存放在这里。2,Attach一个功能注意到上面关于“Xaml解析器”的那段话:“会去看MyClass类中是否存在SetMyAttachProperty(arg1, arg2)方法,如果存在则将被Attach的对象作为arg1,Attach的属性值作为arg2,然后去调用SetMyAttachProperty方法”, 既然被Attach的对象都被作为参数传递到后台代码了,那么后台代码就可以针对该对象“想干嘛,干嘛”。下面这个Demo将在TextBox上附加一个功能:当按下回车键的时候,弹出一个消息框并显示文本框的内容。FunctionService的代码一个如何写呢?非常简单:代码publicstaticclassFunctionServicepublicstaticvoidSetEnableReturnKeyFeature(objectobj,boolenable)varui=objasTextBox;if(ui!=null)ui.KeyDown-=OnUIKeyDown;if(enable)ui.KeyDown+=OnUIKeyDown;staticvoidOnUIKeyDown(objectsender,KeyEventArgse)varui=senderasTextBox;if(ui!=null)MessageBox.Show(ui.Text);下载该示例代码3,Sliverlight中的Behavior我们可以将一个个的功能从上面的函数形式“独立出来”而变成一个一个的对象,以便我可以简单地像添加删除对象一样添加删除功能,并且,如果对象化了,该对象中变可以包含无数的状态信息以及时间等等,这个被独立出来的对象就成为Behavior。似乎要在Sliverlight中使用Behavior,还要添加一个来自于Blend的System.Windows.Interactivity.dll. 呵呵,没必要,搞清楚原理后自己写一个更方便。先写一个BehaviorBase,它的AssociatedObject表示当前Behavior将附加到哪个对象,其Attach(Obj)方法则实现”附加“操作。(注:为了避免干扰实现,我将BehaviorBase里面的许多代码都删掉了,比如事件通知等)publicabstractclassBehaviorBaseprotectedobjectAssociatedObjectget;privateset;publicvoidAttach(objectobj)if(obj!=AssociatedObject)AssociatedObject=obj;OnAttached();protectedvirtualvoidOnAttached()我们提供了OnAttached方法,子类可以重写该方法,以便对象被关联进来以后,针对对象进行一些操作。其泛型版本:publicabstractclassBehavior:BehaviorBaseprotectedTAssociatedObjectgetreturn(T)base.AssociatedObject;然后我们具体的Behavior实现则继承一下Behavior, 比如下面的Behavior将对文本框增加一个功能:当按下回车键的时候,弹出一个消息框并显示文本框的内容。publicclassReturnKeyBehavior:BehaviorprotectedoverridevoidOnAttached()base.OnAttached();AssociatedObject.KeyDown+=OnAssociatedObjectKeyDown;voidOnAssociatedObjectKeyDown(objectsender,System.Windows.Input.KeyEventArgse)vartxtBox=senderasTextBox;if(txtBox!=null)MessageBox.Show(txtBox.Text);恩,到目前为止,我们已经将一个功能完全对象化,那么紧接着的事情就是如果将该对象和界面元素(软件界面上的某个文本框控件)关联起来,很简单,调用该Behavior的Attach方法就可以了,但谁来调用呢,当然不是界面元素,我们可以写一个辅助类来专门负责关联,假设叫BehaviorService(也就是Sliverlight3中的Interaction类): publicstaticclassBehaviorServicepublicstaticvoidSetB
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/GDACERCU 0009-2020废旧动力蓄电池回收制取电池级硫酸镍绿色工艺规范
- 高中化学说课课件教学
- 高中化学冶金课件
- 2025学年四川省高三语文秋季入学摸底考试卷附答案解析
- 半导体行业市场前景及投资研究报告:走向更高端国产掩膜版厂商2.0时代
- 高一化学钠课件
- 砂石场物流管理人员劳动合同及供应链管理协议
- 景观园林住宅区物业合同终止及园林景观维护协议
- 体育休闲公园空地租赁及赛事运营管理合同
- 离婚协议书范本:共同债务处理明确责任归属
- 2025秋新部编版一年级上册语文教学计划+教学进度表
- (2025)社区网格员笔试考试题库及答案
- 大学英语四级高频词汇1500+六级高频词汇1500
- GB/T 20841-2007额定电压300/500V生活设施加热和防结冰用加热电缆
- 《智慧农业》的ppt完整版
- LANTEK兰特钣金软件手册(下)
- 测井曲线综合解释(课堂PPT)
- 贮水花盆案例总结-2015天津中心修改
- DB37_T 4496-2022 水工混凝土表面涂层质量检测技术规程
- 技术研发项目成本核算表
- 水库除险加固工程主体工程完工投入使用验收施工管理工作报告
评论
0/150
提交评论