2.WPF的主要类

WPF学习目录

2.WPF的主要类

- DispatcherObject 
 |- DependencyObject
  |-Visual
   |-UIElement 
    |-FrameworkElement
     |-Shape
     |-Control
      |-ContentControl
      |-ItemsControl
     |-Panel

WPF核心名称空间以System.Windows开头(如System.Windows、System.Windows.Controls 以及System.Windows.Media)。
唯一例外是由System.Windows.Froms开头的名称空间,它们是 Windows窗体工具包的一部分.

2.1 System.Threading.DispatcherObject 类

WPF 中的大多数对象都派生自 DispatcherObject ,它提供了用于处理并发和线程处理的基本构造。 
WPF 基于调度程序实现的消息传递系统。 
类似于熟悉的 Win32 消息泵;事实上,WPF 调度程序使用 User32 消息执行跨线程调用。

DispatcherObject 提供对 WPF 线程模型的支持,并启用为与关联的应用程序创建的所有对象 WPF Dispatcher 。 即使你不是从UIElement、DependencyObject或Visual派生的,也应该考虑从DispatcherObject派生以获得此线程模型支持。

WPF 应用程序使用单线程亲和(Single-Thread Affinity, STA)模型,这意味着整个用户界面由单个线程拥有。 从另一个线程与用户界面元素进行交互是不安全的。

为方便使用此模型, 每个 WPF 应用程序由协调消息(键盘输入、鼠标移动乃至框架处理, 如布局)的调度程序管理。

通过继承自 DispatcherObject 类,用户界面中的每个元素都可以检查代码是否在正确的线程上运行, 并能通过访问调度程序为用户界面线程封送代码。

2.2 System.Windows.DependencyObject 类

在 WPF 中,主要通过属性与屏幕上的元素进行交互。
在早期设计阶段, WPF 的设计者决定创建一个更加强大的属性模型,该模型支待许多特性,例如更改通知、 默认值继承以及减少属性存储空间,最终结果就是依赖项属性(dependency property)特性。

构建 WPF 时使用的一个主要体系结构理念是对方法或事件的属性的首选项。 属性具有声明性,可更方便地指定用途而不是操作。 
支持模型驱动或数据驱动的系统,以显示用户界面内容。 

若要使行为与属性值相关联,需要在属性值更改时收到通知。 
Microsoft .NET 框架有一个接口 INotifyPropertyChange,该接口允许对象发布更改通知,但是它是可选的。

WPF 提供了更丰富的属性系统,它派生自 DependencyObject 类型。 
该属性系统实际是一个“依赖”属性系统,因为它会跟踪属性表达式之间的依赖关系,并在依赖关系更改时自动重新验证属性值。

2.3 System.Windows.Media.Visual 类

Visual类提供用于生成可视对象树的,其中每个对象都有选择地包含绘图指令以及有关如何将这些指令呈现 (剪裁、转换等 ) 的元数据。 Visual 设计为非常轻量且灵活,因此,大多数功能都没有公共 API 泄露,并且很大程度上依赖于受保护的回调函数。

Visual 确实是 WPF 组合系统的入口点。 Visual 这两个子系统之间的连接点,托管 API 和非托管 milcore。

WPF 通过遍历由 milcore 管理的非托管数据结构来显示数据。 这些结构(称为组合节点)代表层次结构显示树,其中每个节点都有呈现指令。 只能通过消息传递协议来访问此树(如下图右侧所示)。

编程 WPF 时,创建 Visual 元素和派生类型,它们通过此消息传递协议在内部与组合树进行通信。 VisualWPF 中的每个都可以创建一个、无或多个组合节点。

在 WPF 窗口中显示的每个元素本质上都是 Visual 对象。

可将 Visual 类视为绘图对象, 其中封装了绘图指令、 如何执行绘图的附加细节(如剪裁、 透明度以及变换设置)以及基本功能(如命中测试)。

Visual 类还在托管的 WPF 库和渲染桌面的 milcore.dll 程序集之间提供了链接。

任何继承自 Visual 的类都能在窗口上显示出来。 如果更愿意使用轻撮级的API创建用户界面, 而不想使用 WPF 的高级框架特征,

2.4 System.Windows.UIElement 类

UIElement 定义包含布局、输入和事件的核心子系统。

布局是 WPF 中的核心概念。

在许多系统中,可能有一组固定的布局模型(HTML 支持三种布局模型:流、绝对和表),也可能没有布局模型(User32 实际仅支持绝对定位)。

在 UIElement 级别上,引入了布局的基本协定–具有和通过的两阶段 Measure 模型 Arrange。

输入是作为内核模式设备驱动程序上的信号发出的,并通过涉及 Windows 内核和 User32 的复杂过程路由到正确的进程和线程。

每个输入事件至少会转换为两个事件 -“预览”事件和实际事件。

WPF 中的所有事件都具有通过元素树路由的概念。 如果事件从目标向上遍历到根,则称为 "冒泡"; 如果从根开始向下遍历到目标,则称为 "隧道"。

2.5 System.Windows.FrameworkElement 类

FrameworkElement 可以通过两种不同的方式进行查看。 它在 WPF 的较低层中引入的子系统上引入了一组策略和自定义项。 它还引入了一组新的子系统。

两个最关键的 FrameworkElement 是数据绑定和样式。

WPF 中数据绑定的最有趣的功能之一是引入数据模板。 
利用数据模板,可以通过声明方式指定某个数据片断的可视化方式。 
无需创建可绑定到数据的自定义用户界面,而是转而让数据来确定要创建的显示内容。

样式实际上是轻量型的数据绑定。 
使用样式,可以将共享定义的一组属性绑定到元素的一个或多个实例。 
样式可通过显式引用 (应用于元素,方法是将 Style 属性设置) 或通过将样式与元素的 CLR 类型相关联来隐式引用。

FrameworkElement 类是 WPF 核心继承树中的最后一站。

该类实现了一些全部由 UIElement 类定义的成员。

例如, UIElement 类为 WPF 布局系统设置了基础, 但 FrameworkElement 类提供了支持它的重要属性(如 HorizontalAlignment 和 Margin 属性)。

UIElement 类还添加了对数据绑定、 动画以及样式等核心特性的支持。

2.6 System. Windows.Shapes.Shape 类

基本的形状类(如 Rectangle 类、 Polygon 类、 Ellipse 类、 Line 类以及 Path 类)都继承自该类。

可将这些形状类与更传统的 Windows 小组件(如按钮和文本框)结合使用。

2.7 System.Windows.Controls.Control 类

控件的最重要功能是模板化。 如果将 WPF 的组合系统视为一个保留模式绘制系统,则控件可通过模板化以一种参数化的声明性方式描述其绘制。 ControlTemplate实际上只是一个脚本来创建一组子元素,并将绑定到控件提供的属性。

Control 提供了一组常用属性, Foreground Background 这些属性 Padding 用于命名几个模板创作者,然后可以使用这些属性自定义控件的显示。 控件的实现提供了数据模型和交互模型。 交互模型定义了一组命令(如窗口的“关闭”),以及到输入笔势的绑定(如单击窗口右上角的红叉)。 数据模型提供了一组属性,用于自定义交互模型或自定义显示内容(由模板确定)。

数据模型(属性)、交互模型(命令和事件)及显示模型(模板)之间的划分,可实现对控件的外观和行为的完全自定义.

控件(control)是可与用户进行交互的元素。

控件显然包括 TextBox 类、 Button 类和 ListBox 类等。

Control 类为设置字体以及前景色与背景色提供了附加属性。

但最令人感兴趣的细节是模板支持, 通过模板支待, 可使用自定义风格的绘图替换控件的标准外观。

注意:

在 Windows窗体编程中,窗体中的每个可视化项都称为控件。 
在 WPF 中,情况不再如此。 可视化内容被称为元素(element), 只有部分元素是控件(控件是那些能够接收焦点并能与用户进 行交互的元素)。 
更令人费解之处在于, 许多元素是在 System.Windows.Controls 名称空间中定 义的, 但它们不是继承自 System.Windows.Controls. Control 类, 并且不被认为是控件. Panel 类 便是其中一例 .

2.8 System. Windows. Controls. ContentControl 类

ContentControl 类是所有具有单一内容的控件的基类, 包括简单的标签乃至窗口的所有内容。

该模型给人印象最深刻的部分是: 控件中的单一内容可以是普通字符串乃至具有其他形状 和控件组合的布局面板

2.9 System. Windows.Controls. ltemsControl 类

ltemsControl 类是所有显示选项集合的控件的基类, 如 ListBox 和 TreeView 控件。

列表控件十分灵活一例如,使用 ItemsControl 类的内置特征,可将简单的 ListBox 控件变换成单选按钮列表、 复选框控件列表、 平铺的图像或是您所选择的完全不同的元素的组合。

实际上, WPF 中的菜单、 工具栏以及状态栏都是特定的列表, 并且实现它们的类都继承自 ItemsContorl 类。

2.0 System.Windows.Controls.Panel 类

Panel 类是所有布局容器的基类,布局容器是可包含一个或多个子元素、并按特定规则对子 元素进行排列的元素。

这些容器是 WPF 布局系统的基础, 要以最富有吸引力、 最灵活的方式安排内容, 使用这些容器是关键所在。

WPF学习目录

posted @ 2021-07-04 20:35  x_amos  阅读(293)  评论(0编辑  收藏  举报