WPF可以认为是MS利用原有.NET框架的一些特色,加上DirextX的产物。将原有的编程模型统一化.
我们来看看WPF的运行机制.
那么我们现在来分析一下WPF的运行过程吧。
首先从第一个方块说起:WPF的进程会加载四个程序集,Kernel,User32,DirectX,milcore.他们对原有的CLR进行了扩 展。我们看看他们分别起什么作用。Kernel,它负责控制和管理与图形驱动相关的最底层任务等。在Kernel之后也是两个比较底层的模块。其 中,User32负责确定显示窗口及其在屏幕中的位置状态等,其并不参与常见控件的呈现。DirectX负责呈现窗口和内容等。milcore是WPF的 核心部分,它主要起到中间人的作用,以实现WPF与DirectX的通信(非受管模块)。
第二个方块:由CLR来加载WPF的另三个程序集WindowsBase,PresentationFramework和PresentationCore,它们都是受管模块。我们下边要讲解的WPF主要类型,基本都来自于这三个dll。
WindowsBase是WPF API基础架构的核心类型。
PresentationCore主要包括WPF的一些基本类型,例如UIElement,Visual等。它们是PresentationFramework所包括元素的基类。
PresentationFramework主要定义WPF的窗口、面板、样式等高层WPF类型。
第三个方块:编译好机器码以后,就可以执行指令了,这里会创建Systemdomain,它包含了SharedDomain和默认的应用程序域,也 就是当前应用程序自己的域,前面我们说过一个.net进程中可以包含多个默认的应用程序域,而这些应用程序域都会用到mscorlib.dll,如果每个 默认的应用程序域中都去加载它,那么无疑会造成内存的浪费,所以就有了SharedDomain,它是用来放所有Domain都要用到的Dll,这样就避 免了浪费内存.也优化了加载的速度.
第四个方块:这时候默认的应用程序域,就会去找到WPF项目中的Main方法.
OK明白了WPF的启动过程,我们来看看WPF程序中要用到的主要类的层次关系:
DispatcherObject: WPF中有许多类继承自DispatcherObject,DispatcherObject提供了处理同步和并发的基本构造。WPF建立在 dispatcher提供的消息系统之上。WPF的dispatcher使用User32消息来实现线程间调用。
DependencyObject :构建WPF的一个主要思想是属性优先于方法和事件。WPF提供了丰富的属性系统,其核心是DependencyObject。
Visual:该类的主要作用是为WPF提供2D呈现支持,主要包括输出显示,坐标转换,区域剪切等。
UIElement:该类继承自Visual类,是构建WPF元素和基本呈现特征的基类,其中定义很多与输入和焦点有关的特性,例如键盘事件,鼠标,还包括一些与WPF事件模型有关的API。
FrameworkElement:继承了UIElement类,而且还添加了一些功能,例如,布局定义、逻辑树、对象生命周期事件、支持数据绑定和动态资源引用、支持样式和动画。
WPF中的控件,图形操作,动画多媒体,以及3D效果就是由下面4个类的派生类来完成的:
1Control是创建自定义应用程序控件的基类。可以重写Control类所提供的属性,方法,事件等,为自定义控件添加自定义逻辑。 构建WPF应用程序页面的window类就派生自它.还有button,TextBox等控件也派生自他。
2Shape:WPF 中呈现二维矢量图形的基础类。有 Line、Polyline、Polygon、Path、Rectangle 和 Ellipse等子类。可从 Shape 类进行派生以实现自定义矢量图形基元。从 Shape 派生是确保这些自定义基元使用 WPF 布局系统的协议的最简单方法。
3Freezable:WPF中对动画和多媒体的操作类,基本上都是派生自它,它实现了多种生成深层克隆的方法。
4Visual3D:提供可视三维对象通用的服务和属性,其中包括命中测试、坐标转换和边界框计算。与Visual类一样,只不过是3D的基础类.