WPF(2)第一篇 Overview

普通的WinForm本质上是依赖于Windows API(User32和GDI/GDI+)负责创建控件,负责控件的外观显示。因此我们在自定义Control时经常需要重写OnPaint方法,在里面负责绘制的每一个细节。
WPF改变了这种模式,所有的渲染都依赖于DirectX。 因此能够提供各种各样丰富的外观,而且使得加入动画效果变得简单,能够实现更酷的效果如fade in,fade out,改善用户体验。以前想要在Grid里同时显示图片和文字可能是很多人的梦魇,现在简单的让人难以置信。各种control里可以嵌套control。(不过WPF对于没有显卡的机器真是一种折磨,慢的跟坨驴似的。)
DirectX是基于硬件加速,因此能够提供更加有效的渲染效果和效率。但由于消息的处理机制仍然没有改变,所以依然要依赖于User32。WPF是用来替代GDI/GDI+,而非User32。

WPF架构图(来自msdn):
ms750441_wpf_architect1(en-us,VS_90) 
milcore模块也是WPF的一部分,管理显示状态,负责将上层的visual等对象转换为DirectX所认识的三角面片等元素。基于性能的考虑,milcore是以非托管的方式实现。

DispatcherObject

这个是大部分WPF对象的基类,提供了用于处理并发和线程的能力。其中主要的函数CheckAccess()相当于Control.InvokeRequired, 如果返回true,表示调用线程是在UI线程,可以访问此对象,否则就需要此对象的Dispatcher的Invoke方法

DependencyObject

继承此类的对象可以自动获得属性更改的通知,可以获得缺省的继承值(继承其父控件同一属性值),提供了附加属性的概念(attached properties)。主要的方法为GetValue(),SetValue(),虚的OnPropertyChanged().CoerceValue()强制转换所指定依赖项属性的值
比较好奇的是其将GetHashCode()和Equals()都标为sealed了,意味着子类不能重写这些方法。

Visual

visual对象包含了要绘制图元的基本信息,并负责与底层的milcore渲染系统交互。任何继承自Visual的类都能够被显示在屏幕上。

UIElement

为WPF提供了LIFE的能力:layout,input,focus和events
有个重要的函数叫Measure(),使得控件能够获得自身的大小。
实现了IInputElement接口,提供了与外界交互的能力。
实现了IAnimatable接口获得了动画的支持。

FrameworkElement

实现了UIElement定义的一些关于布局的方法,并提供了一组于此相关的属性,如HorizontalAlignment, VerticalAlignment, MinWidth, 和 Margin等
此类引入了data binding 和 styles的功能

Control

此类提供的最有意思的功能就是可以模板化

参考:

WPF Architecture (ms-help://MS.MSDNQTR.v90.en/wpf_conceptual/html/8579c10b-76ab-4c52-9691-195ce02333c8.htm)

(本blog只是个人对上面WPF Architecture 一文的简单理解和摘录)

原文地址:https://www.cnblogs.com/anders06/p/1179288.html