依赖属性之“风云再起”
发布时间:2020-12-13 20:21:59 所属栏目:百科 来源:网络整理
导读:一. 摘要 首先圣殿骑士很高兴” WPF 基础到企业应用系列” 能得到大家的关注、支持和认可。看到很多朋友留言希望加快速度的问题,我会尽力的,对你们的热情关注也表示由衷的感谢。这段时间更新慢的主要原因是因为忙 着用TDD还原MONO的框架,同时也因为一直在
一. 摘要
首先圣殿骑士很高兴”
WPF 基础到企业应用系列” 能得到大家的关注、支持和认可。看到很多朋友留言希望加快速度的问题,我会尽力的,对你们的热情关注也表示由衷的感谢。这段时间更新慢的主要原因是因为忙 着用TDD还原MONO的框架,同时也因为一直在研究云计算,所以就拖拖拉拉一直没有发布后面的文章。由于WPF整个系列是自己的一些粗浅心得和微薄经 验,所以不会像写书那么面面俱到,如果有不足或者错误之处也请大家见谅。在今年之内圣殿骑士会尽量完成”
WPF 基础到企业应用系列”和”
云计算之旅系列“,诚然,由于本人才识浅薄,所以热切希望和大家共勉!
由于依赖属性是WPF和Silverlight的核心概念,微软在CS和BS平台上主要精力都放到了WPF和Silverlight技术 上,同时Silverlight也是Windows Phone的两大编程模型之一(另外一种是XNA),所以我们花费了大量的时间和篇幅进行论述。在上一篇
WPF基础到企业应用系列7――深入剖析依赖属性中, 我们首先从依赖属性基本介绍讲起,然后过渡到依赖属性的优先级、附加属性、只读依赖属性、依赖属性元数据、依赖属性回调、验证及强制值、依赖属性监听、代 码段(自动生成) 等相关知识,最后我们模拟一个WPF依赖属性的实现,由于上篇是根据微软WPF的BCL源码剖析的,所以这篇我们就研究一下.NET的跨平台版本 MONO,看下它是怎么来实现这个依赖属性机制。
二. 本文提纲
三. 兵马未动,废话先行
在讲这篇文章之前,我们先来拉一拉家常,说点题外话,就当进入正餐之前的一些甜点,当然这里主要针对.NET平台而言:
1,浅谈软件技术的发展趋势及定位
互联网的普及应用催生了很多技术的发展与更新,如果仔细深究,你会发现软件技术的发展趋势将主要体现在以下四个方面:客户端软件开发(其中包括 客户端软件、游戏、中间件和嵌入式开发等)、Web 开发(包括传统的Web技术、Web游戏以及一些在线应用)、移动设备软件开发(主要涉及到手机等移动设备)、云计算开发(公有云、私有云、混合云会逐渐 界限清晰,云厂商以及云平台也会逐渐整合和成熟起来)。就微软来说,这四个方面主要如下:
其实把这四个方面总结起来就是传说中的微软“三屏一云”战略,从中也可以看出微软逍遥于天地,纵横于宇内,啸傲于世间,雄霸于大地的枭雄战略!
2,浅谈微软跨平台与MONO
在谈之前我们先看一下什么是MONO?MONO项目是由Ximian发起、Miguel de lcaza领导、Novell公司主持的项目。它是一个致力于开创.NET在Linux,FreeBSD,Unix,Mac OS X和Solaris等其他平台使用的开源工程。它包含了一个C#语言的编译器,一个CLR的运行时,和一组类库,并逐渐实现了 ADO.NET、ASP.NET、WinForm、Silverlight(可惜没有实现强大的WPF),能够使得开发人员在其他平台用C#开发程序。
◆ 值得看好的地方:
◆ 不足之处:
◆ 与微软之间的关系
微软与MONO之间的关系也一直处于不冷不热的状态,没有明确的反对,也没有明确的支持,究其原因笔者认为主要有以下两点:
◆ 总结
虽然目前来说MONO喜忧参半,但优点始终要大于缺点,毕竟每一个框架或者产品都是慢慢不断改进而完善的,更何况开源必将是未来的一个趋势,所以我们有理由也有信心期待它接下来的发展。
3,谈谈源码研究与TDD
大家都有一个共识:如果你想研究某个框架或者工具的源码,那先必须熟练使用它,熟练之后自然就有一种研究它的冲动,但是往往这个框架或工具比较 庞大,很不容易下手,一个很不错的方法就是使用TDD。我们都知道TDD的基本思想就是在开发功能代码之前,先编写测试代码。也就是说在明确要开发某个功 能后,首先思考如何对这个功能进行测试,并完成测试代码的编写,然后编写相关的代码满足这些测试用例。然后循环进行添加其他功能,直到完全部功能的开发, 在此过程中我们可以借助一些工具来协助。比如我们现在要研究Nhibernate,那么我们首先要熟练它的一些功能,然后从一个点出发慢慢编写单元测试, 然后逐渐完善代码,最后直至完成框架的搭建,这样会给我们带来莫大的驱动力和成就感。除了微软的BCL(Base Class Library)和企业库以外,大家还可以用TDD来试试还原以下的任一开源代码:
Spring.NET(
http://www.springframework.net/)、Castle(
http://www.castleproject.org)、log4net(
http://logging.apache.org/log4net/)、
NHibernate(
http://www.hibernate.org/343.html)、iBATIS.NET(
http://ibatis.apache.org)、Caliburn(
http://caliburn.codeplex.com/)、
MVVM Light Toolkit(
http://mvvmlight.codeplex.com/)、Prism(
http://compositewpf.codeplex.com/)、MONO源码(
www.mono-project.com)
四. 依赖属性续前缘
大家都知道WPF和Silverlight带来了很多新的特性,其中一大亮点是引入了一种新的属性机制――依赖属性。依赖属性基本应用在了 WPF的所有需要设置属性的元素。依赖属性根据多个提供对象来决定它的值(可以是动画、父类元素、绑定、样式和模板等),同时这个值也能及时响应变化。所 以WPF拥有了依赖属性后,代码写起来就比较得心应手,功能实现上也变得非常容易了。如果没有依赖属性,我们将不得不编写大量的代码。依赖属性在WPF中 用得非常广泛,具体在以下几个方面中表现得尤为突出:
在上一篇WPF基础到企业应用系列7――深入剖析依赖属性中,我们对依赖属性做了较详细的介绍,那么下面我们就简单回顾一下,其实依赖属性的实现很简单,只要做以下步骤就可以实现:
根据前面的四步操作,我们就可以写出下面的代码:
1: public class SampleDPClass : DependencyObject 2: {
3: //声明一个静态只读的DependencyProperty字段 4: static readonly DependencyProperty SampleProperty; 5:
6: static SampleDPClass() 7: {
8: //注册我们定义的依赖属性Sample 9: SampleProperty = DependencyProperty.Register("Sample",typeof(string),255);">typeof(SampleDPClass), 10: new PropertyMetadata("Knights Warrior!",OnValueChanged)); 11: }
12:
13: private void OnValueChanged(DependencyObject o,DependencyPropertyChangedEventArgs e) 14: {
15: //当值改变时,我们可以在此做一些逻辑处理 16: }
17:
18: //属性包装器,通过它来读取和设置我们刚才注册的依赖属性 19: string Sample 20: {
21: get { return (string)GetValue(SampleProperty); } 22: set { SetValue(SampleProperty,255);">value); }
23: }
24: }
通过上面的例子可以看出,我们一般.NET属性是直接对类的一个私有属性进行封装,所以读取值的时候,也就是直接读取这个字段;而依赖属性则是 通过调用继承自DependencyObject的GetValue()和SetValue来进行操作,它实际存储在 DependencyProperty的一个IDictionary的键-值配对字典中,所以一条记录中的键(Key)就是该属性的HashCode值, 而值(Value)则是我们注册的DependencyProperty。 回顾了一些基础知识,那我们下面就开始今天的依赖属性系统TDD之旅。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ARM上的高效复制,两个16位读取还是一个32位?
- xml – XSLT输出到HTML
- Ajax(4)利用 DOM 进行 Web 响应
- ruby-on-rails – 使用redirect_to:创建动作
- c# – Nsubstitute调用方法,即使有DoNotCallBase
- 以编程方式更改Flex标签/文本组件的字体,大小,重量和颜色
- ruby-on-rails – Rails pixelarity模板(skel)
- c# – 在没有安装Visual Studio的情况下以编程方式创建cspr
- 如何在Real(SQlite)列中存储BigDecimal(Java)值?
- vb.net货币显示有四个零而不是两个