本文共 6262 字,大约阅读时间需要 20 分钟。
· 1.摘要· 2.本文提纲· 3.兵马未动、废话先行· 4.依赖属性续前缘· 5.引入测试驱动开发· 6.DependencyProperty测试代码· 7.DependencyProperty实现代码· 8.DependencyObject测试代码· 9.DependencyObject实现代码· 10.PropertyMetadata测试代码· 11.PropertyMetadata实现代码· 12.其他协助类测试代码· 13.其他协助类的实现代码· 14.回归并统计覆盖率· 15.简单验证依赖属性系统· 16.本文总结· 17.相关代码下载· 18.系列进度
◆ 客户端软件开发
目前微软主要有Win32 应用程序、MFC 应用程序、WinForm应用程序和WPF 应用程序作为开发选择,目前这四种技术还会共存,因为不同的需求以及不同的人群都有不同的需要。当然WPF借助于其强大的功能和迅猛的发展速度很快会成为 首选,这个是值得肯定的。◆ Web 开发
在WEB方面微软主要有ASP.NET、ASP.NET MVC、Silverlight三种技术,ASP.NET技术已经发展了多年,在未来的很长一段时间内还会是主流,同时结合Silverlight作为局 部和整体应用效果都还很不错,所以这也是很多企业的首选。ASP.NET MVC在目前来说应用还不是特别广泛,不过用过之后感觉也还不错,只是还需要一段时间的适应过程而已。Silverlight在构建局部应用和整站应用都 发挥了不错的优势,在Windows Phone中也表现得不错,所以这个技术将会一直热下去。◆ 移动设备软件开发
移动设备方面可谓是现在众厂商竞争最激烈的市场之一,也是传统技术和新型技术的主要战场之一。微软现在主推的Windows Phone开发主要包括Silverlight和XNA两种技术,Windows Phone开发逐渐变得和ASP.NET开发一样简单,这也是微软的一个目标。◆ 云计算开发
云计算现在基本上成了互联网的第一大热门词,不管是软件为主导的企业,还是以硬件为主导的企业,都卷入了这场纷争与革命。微软的云平台—— Windows Azure Platform,它是微软完整的云计算平台,目前包含了如下三大部分(Windows Azure:运行在云中的操作系统,对于用户来说是虚拟且透明的,其中提供了Compute(计算),Storage(存储),以及Manage(管理) 这三个主要功能及其底层服务,使用起来相当的便捷。SQL Azure:运行于云中的一个关系数据库,和SQL Server 2008类似,但是在功能上还没有那么强大。AppFabric:全名是Windows Azure platform AppFabric,提供了访问控制、服务总线等服务,主要用于把基础应用连接到云中)。
1,跨平台:开创.NET在Linux,FreeBSD,Unix,Mac OS X和Solaris等其他平台使用,这是微软没有实现的,但是MONO进行了补充,所以值得看好。2,开源:不论使用什么技术,大家似乎都希望能够用开源的产品,一方面是考虑到技术的可控性和可维护性;另一方面则是考虑到安全性,当然在另一个角度也是可以学习到其中的一些技术和思想,所以大家对开源总是报以欢迎的态度。3,不同的方式实现.NET框架:由于微软对技术申请了专利,所以MONO不能盲目的模仿,对很多细节都改用自己的方式进行了实现,所以我们也可以学到很多不一样的实现方式。4,持续更新:MONO从一开始到现在始终在更新,其中包括bug修复、版本升级、增加新的功能及应用,所以相信它会在不断的更新中更加完善。
1.模仿但要避免专利:由于是模仿微软.NET平台,但因为微软对代码申请了专利,所以MONO只能采用其它实现方式来实现同样的功能,这样一来很多地方就会实现得很累赘,效率也会受损。2.没有摆脱实验产品的头衔:由于它目前的使用比较低,所以信息反馈和持续改进就做得比较弱,这也是目前功能完善得比较慢的原因之一吧。3,功能还需要完善:一些主要功能还未实现,如作为Windows平台最基础的COM和COM+功能没有保存,像MSMQ等消息队列,消息传送的功 能也没有实现,对ADO.NET、XML等核心功能效率有待提升,对BCL库代码也有很多需要优化的地方,强大的WPF也没有引入。4.效率和用户体验还有待提升。
1,微软带来最大收益的产品仍旧是Windows操作系统和Office等软件,微软在其他领域盈利都没有这两大产品来得直接。而.NET作为微软 的强大开发平台,是不希望落在其他平台上运行的,这样就会削弱Windows操作系统和Office等软件的市场占有率,所以让.NET跨平台对微软来说 是一件舍本求末的事情,这也是微软不主张.NET运行于其他平台的主要原因,你想微软是一个以技术为主导的公司,任何IT市场都会有它的身影,如果想 让.NET跨平台,那岂不是一件很轻而易举的事情吗?2,由于MONO还没有成熟,在很多方面都表现得像一个实验室产品,在根本上没有对微软构成威胁,况且在外界质疑.NET是否能跨平台的时候,还有一个现身的说法,所以微软也不会明确的反对和支持。
◆ UI的强大属性体系◆ Property value inheritance(值继承)◆ Metadata(强大的元数据)◆ 属性变化通知,限制、验证◆ Resources(资源)◆ Data binding(数据绑定)◆ Styles、Template(样式、模板和风格)◆ 路由事件、附加事件、附加行为乃至命令◆ Animations、3D(动画和3D)◆ WPF Designer Integration(WPF设计、开发集成)
◆ 第一步: 让所在类型继承自 DependencyObject基类,在WPF中,我们仔细观察框架的类图结构,你会发现几乎所有的 WPF 控件都间接继承自DependencyObject类型。 ◆ 第二步:使用 public static 声明一个 DependencyProperty的变量,该变量才是真正的依赖属性 ,看源码就知道这里其实用了简单的单例模式的原理进行了封装(构造函数私有),只暴露Register方法给外部调用。 ◆ 第三步:在静态构造函数中完成依赖属性的元数据注册,并获取对象引用,看代码就知道是把刚才声明的依赖属性放入到一个类似于容器的地方,没有讲实现原理之前,请容许我先这么陈述。 ◆ 第四步:在前面的三步中,我们完成了一个依赖属性的注册,那么我们怎样才能对这个依赖属性进行读写呢?答案就是提供一个依赖属性的实例化包装属性,通过这个属性来实现具体的读写操作。
1: public class SampleDPClass : DependencyObject
2: {
3: //声明一个静态只读的DependencyProperty字段
4: public static readonly DependencyProperty SampleProperty;
5:
6: static SampleDPClass()
7: {
8: //注册我们定义的依赖属性Sample
9: SampleProperty = DependencyProperty.Register("Sample", typeof(string), typeof(SampleDPClass),
10: new PropertyMetadata("Knights Warrior!", OnValueChanged));
11: }
12:
13: private static void OnValueChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
14: {
15: //当值改变时,我们可以在此做一些逻辑处理
16: }
17:
18: //属性包装器,通过它来读取和设置我们刚才注册的依赖属性
19: public string Sample
20: {
21: get { return (string)GetValue(SampleProperty); }
22: set { SetValue(SampleProperty, value); }
23: }
24: }