WPF 开发教程之UIElement、FrameworkElement和ContentElement

在WPF常用控件的基类是FrameworkElement,FrameworkContentElement,这两个控件类又是从UIElement和ContentElement派生出来的。

UIElement是 WPF 核心级实现的基类,这些实现是在 WPF元素和基本表示特性上生成的。

UIElement 提供元素布局特征的起点,还公开派生类可以重写的虚拟方法,这可能会影响元素及其子元素的布局呈现行为。

通常,类中还定义了元素的大部分输入和焦点行为 UIElement。 这包括键盘、鼠标和触笔输入的事件以及相关的状态属性。 其中的许多事件都是路由事件,许多输入相关事件都具有冒泡路由版本以及事件的隧道版本。 这些配对事件通常是控制作者最感兴趣的事件。

UIElement还包括与 WPF 事件模型相关的 Api,包括可以引发源自元素实例的指定路由事件的方法。

就体系结构而言, UIElement可以考虑大致等效于 Win32 编程中的窗口句柄,或动态 HTML (DHTML) 编程中的元素。

提供很多鼠标移动,键盘输入依赖属性,还提供元素基础事件定义。比如常用的:IsEnabled,Focusable,IsMouseOver,Opacity等都是从此类定义的。

FrameworkElement为为 WPF元素提供框架级别的一组属性、事件和方法。此类表示提供的 WPF 框架级实现,该实现基于UIElement定义的 WPF 核心级 API 构建。

继承关系是:DependencyObject->Visual->UIElement->FrameworkElement

FrameworkElement 扩展 UIElement 并添加了以下功能:

布局系统定义: FrameworkElement 针对在中定义为虚拟成员的某些方法提供特定的 WPF 框架级实现 UIElement 。 最值得注意的是, FrameworkElement 密封某些 wpf 核心级别的布局替代,并提供 wpf 框架级别等效项,派生类应改为重写。 例如, FrameworkElement 密封 ArrangeCore 但提供 ArrangeOverride 。 这些更改反映了这样一个事实:在 WPF 框架级别,有一个完全布局系统可呈现任何 FrameworkElement 派生类。 在 WPF 核心级别,将构建基于 WPF 的常规布局解决方案的某些成员是就地的,但布局系统的实际引擎并未定义。 请参阅布局以了解详细信息。

逻辑树: 一般 WPF 编程模型通常以元素树的形式表示。 支持以逻辑树形式表示元素树,并支持在标记中定义该树 FrameworkElement 。 但请注意, FrameworkElement 有意不要定义内容模型,而是将此责任留给派生类。 有关详细信息,请参见 WPF 中的树。

对象生存期事件: 当) 调用构造函数时,或者当元素首次加载到逻辑树中时,知道 (构造函数时,这通常很有用。 FrameworkElement 定义多个与对象生存期相关的事件,这些事件为涉及元素(如添加更多子元素)的代码隐藏操作提供有用的挂钩。 有关详细信息,请参阅 对象生存期事件。

数据绑定和动态资源引用支持: 数据绑定和资源的属性级别支持由 DependencyProperty 类实现并在属性系统中使用,但是,可以解析存储为 Expression (编程构造的成员值,该构造是为数据绑定和动态资源提供基础的,) 由实现 FrameworkElement 。 有关详细信息,请参阅 数据绑定概述 和 XAML 资源。

样式: FrameworkElement 定义 Style 属性。 但是,尚未 FrameworkElement 定义对模板的支持,或不支持修饰器。 这些功能由控件类(如和) Control 引入 ContentControl 。

更多动画支持: 某些动画支持已在 WPF 核心级别定义,但 FrameworkElement 通过实现和相关成员扩展了此支持 BeginStoryboard 。

常用的属性:ActualHeight,DataContext,Loaded,Margin,Margin,Name等。

ContentElement 为内容元素提供 WPF 核心级基类。内容元素设计用于流样式显示,它们使用面向标记的直观布局模型和精心设计的简单对象模型。

ContentElement 定义以下常见内容特征:

输入:所有 ContentElement 派生类都为键盘、鼠标、拖放操作、触笔控件和快捷键提供基本的输入捕获支持。

重点:所有 ContentElement 派生类都有可能获得焦点。 (但基类的默认可设定焦点状态 ContentElement 为 false 。 若要详细了解如何创建可 ContentElement 设定焦点的,请参阅 Focusable

事件: ContentElement 包括与输入和焦点相关的事件; 它还包括状态更改的事件。 在许多情况下, ContentElement 事件是路由事件。 在某些情况下,路由事件同时具有隧道和冒泡路由策略,作为响应相同状态或条件的单独事件而引发。 此外,还 ContentElement 定义了可引发路由事件并且可以添加或删除事件处理程序的 api。

ContentElement 与共享许多常见 Api UIElement 。 这些公共 Api 不来自共享类继承。 但在每个类中,它们共享公共命名、类似行为和相似的 Api 内部实现。 相似性是因为 ContentElement 和 UIElement 都是元素基的每个类,但对于其标记对象模型行为,每个类都有不同的意图。

具体而言, UIElement 从开始 Visual ,后者为在复合窗口内的矩形区域提供更低级别的图形支持 ContentElement ,而 ContentElement 延迟呈现,以便更轻松地支持更常见的文档方案(如 flow 和包装)。 这两个相关的类还实现了公共接口 IInputElement 和 IAnimatable 。

对继承者的说明

ContentElement类尚未定义流样式演示的完整内容元素的所有方面。 FrameworkContentElement 是的直接派生类 ContentElement 。 FrameworkContentElement 包括一组更完整的附加成员,它们支持 FrameworkContentElement 在内容宿主内呈现,并使用 WPF 框架级别布局系统。

 推荐一款WPF MVVM框架开源项目:Newbeecoder.UI

Newbeecoder.UI开源项目

Demo下载:

Newbeecoder.UIicon-default.png?t=M3K6https://download.csdn.net/download/liaohaiyin/63234875​​​​​​​

你可能感兴趣的:(MVVM,UI设计,c#,WPF,wpf,c#)