WPF的体系结构上
这里主要讨论一下WPF的类结构。包含了WPF大多数主要子系统,描述了他们之间是怎样进行交互的,同时也对WPF体系为什么要选择这样或那样的方式来实现WPF的某些部分做一个大概的陈述
本文主要包含如下话题:
1〉 System.Object
2〉 System.Threading.DispatcherObject
3〉 System.Windows.DependencyObject
4〉 System.Windows.Media.Visual
5〉 System.Windows.UIElement
6〉 System.Windows.FrameworkElement
7〉 System.Windows.Controls.Control
8〉 Summary
9〉 Other topics
System.Object
WPF编程模型主要通过托管代码实施。在WPF设计早期,关于在何处区分托管组件和非托管组件一直是一个争论不休的话题。CLR提供了一系列的特性是个整个开发更具效率且获得更好的健壮性能,然而,鱼和熊掌不能兼得,这是以其他方面的代价换来的。
下图展示了构成WPF主要的组件。图的红色区域是WPF的主要组成。其中只有milcore是非托管模块,这主要是为了更好的将DirectX整合到WPF中。其一,WPF中所有的显示由DirectX引擎处理,这将允许高效的硬件和软件渲染。其二,WPF要求对内存和执行体良好的控制。其三,milcore对显示极为敏感,不得不放弃许多CLR提供的好处来获得更好的性能
System.Threading.DispatcherObject
WPF中有许多类继承自DispatcherObject,DispatcherObject提供了处理同步和并发的基本构造。WPF建立在dispatcher提供的消息系统之上。它的工作方式很像win32中的消息泵;事实上,WPF的dispatcher使用User32 消息来实现线程间调用的。
当讨论WPF中的并发时,有两个核心概念需要弄清楚—dispatcher(分发器)thread affinity(线程亲缘性)
线程亲缘性发生在当一个组件要使用当前正在执行线程的变量来存储状态的时候。通用的方式是使用线程局部存储(TLS)来存储这些状态。线程亲缘性要求EXE的每个逻辑线程都只属于存在于OS中的物理线程。
System.Windows.DependencyObject
构建WPF的一个主要的体系哲学是属性优先于方法和事件。属性是声名性的并且允许你更方便的指定你想要的意图。它也支持模型驱动,数据驱动,UI显示。它(前文哲学)允许更多的属性通过绑定实对应用程序的更加方便的控制。
为使更多的系统用属性来驱动,一个比CLR提供的属性系统更加丰富的属性系统是必须的。一个简单的例子就是change notification(更改通知)。为了实现双向绑定。需要绑定双方都实现change notification。为使行为关联到属性值,需要在属性值改变的时候获得通知。Microsoft.NET Framework提供了一个接口:INotifyPropertyChange。通过它一个对象可以发布它自己的change notification。
WPF提供了丰富的属性系统,继承自DependencyObject。它的一个基础是属性表达式。属性系统提供对属性的稀疏保存。