行业知识
WPF依赖属性概述
文章目录
- 一、前言
- 二、依赖属性
- 2.1 前置知识
- 2.2 依赖属性与CLR属性
- 2.3 依赖属性支持CLR属性
- 2.4 设置属性值
- 2.4.1 XAML中设置属性值
- 2.4.2 代码中设置属性
- 2.5 依赖属性提供的属性功能
- 2.5.1 资源
- 2.5.2 数据绑定
- 2.5.3 样式
- 2.5.4 动画
- 2.5.5 元数据覆盖
- 2.5.6 属性值继承
- 2.5.7 WPF设计器集成
- 2.5.8 小结
- 2.6 依赖属性值优先级
- 2.6.1 为什么存在依赖属性优先级?
- 2.7 学习更多有关依赖属性的内容
- 三、���尾
一、前言
最近写的博文知识点都比较基础。
()因为写项目时总会遇到一些奇怪的问题,于是按我的性子,就会回过去学一遍。
这归根到底还是自己基础太差,兜兜转转半天还得回来补习。
()这不,WPF都用了快两年了,又回来学习依赖属性了。
原文地址
二、依赖属性
WPF提供了一组可用于扩展类型属性功能的服务,该服务统称为WPF属性系统。
由WPF属性系统支持的属性称为依赖属性(dependency property)。
本文介绍WPF属性系统和依赖属性的功能,包括如何在XAML和代码中使用现有的依赖属性。
本概述还介绍了依赖属性特有的内容,例如依赖属性元数据、以及如何在自定义类中创建你自己的依赖属性。
2.1 前置知识
假设你已有.NET类型系统和面向对象编程的基础知识。
那么,按照本文中的示例进行操作,有助于你理解XAML和了解如何编写WPF应用程序。
2.2 依赖属性与CLR属性
WPF属性通常会公开为标准的.NET属性。
一般把.NET属性称为CLR属性。这里的WPF属性指依赖属性。
平时,你可能会与这些属性进行交互,但你或许并不知道它们底下是实现为了依赖属性的。而熟悉WPF属性系统的功能,有助于你更好地去使用它们。(从这可以看出来,对使用者来讲,依赖属性其实和CLR属性一样,只是内部实现上有差别)
依赖属性的目的是提供一种方式,基于其他输入值来计算属性值。输入值包括:
- 系统属性,例如主题或用户首选项/偏好。
- 即时(JIT)属性确定机制,例如数据绑定和动画、故事板。
- 多用模板(multiple-use template),例如资源和样式。
- 通过与元素树中的其他元素的父子关系得到的值。
依赖属性嘛,就是有所依赖的属性,依赖的是别的值。通过别的值的更改,来更新计算自己的值。
此外,依赖属性可提供:
- 独立的验证。
- 默认值。
- 监视其他属性更改的回调。
- 可根据运行时信息强制属性值的系统。
派生类可以通过重写依赖属性的元数据来更改现有属性的某些特征,而不需要重写现有属性的现有实现或创建新属性。
在SDK参考文档中,你可以通过该属性的托管参考页上是否存在依赖属性信息段来辨别一个依赖属性。依赖属性信息段包含指向该依赖属性的 DependencyProperty标识符字段的链接。它还包括该属性的元数据选项列表,每个类的覆盖信息以及其他详细信息。
2.3 依赖属性支持CLR属性
依赖属性和WPF属性系统通过提供支持属性的类型来扩展属性功能,以作为使用私有字段支持属性的标准模式的替代方案。该类型的名称是 DependencyProperty 。定义WPF属性系统另一个重要类型是 DependencyObject ,它定义了可注册和拥有依赖属性的基类。
以下是一些常用术语:
- 依赖属性 Dependency property ,这是由 DependencyProperty 支持的属性。
- 依赖属性标识符 Dependency property identifier ,它是注册依赖属性时作为返回值获取的 DependencyProperty 实例,然后存储为类的静态成员。许多与WPF属性系统交互的API使用依赖属性标识符作为参数。
- CLR包装器 CLR “wrapper” ,是属性的get和set实现。这些实现通过在 GetValue 和 SetValue 调用中使用依赖属性标识符来做合并。这样,WPF属性系统就为属性提供了支持。
以下示例定义 IsSpinning依赖属性以展示 DependencyProperty 标识符与其支持属性的关系。
// IsSpinningProperty是依赖属性标识符public static readonly DependencyProperty IsSpinningProperty = DependencyProperty.Register("IsSpinning", typeof(bool), typeof(MainWindow));// IsSpinning是依赖属性public bool IsSpinning{get => (bool)GetValue(IsSpinningProperty);Set => SetValue(IsSpinningProperty, value);}属性的命名规则及其支持的 DependencyProperty 字段非常重要。字段的名称始终是属性的名称,并加上后缀 Property 。
2.4 设置属性值
在代码和XAML中都可以设置属性。
attribute和property都有属性的意思,
property是面向对象的范畴,针对对象的属性特征;attribute是编程语言层面的,针对标签的属性特征,即标签中的 “名称-值” 对。为了避免混淆,后文把property直译为属性,attribute保留英文。
2.4.1 XAML中设置属性值
下面的XAML示例将一个按钮的背景色设置为红色。XAML attribute的字符串值由WPF XAML解析器进行类型转换为WPF类型。在生成的代码中,WPF类型是由 SolidColorBrush 实现的Color。
XAML支持多种设置属性的语法形式。某种属性使用哪种语法取决于属性使用的值类型以及一些其他因素,例如是否存在类型转换器。
下面的XAML示例展示了使用 属性元素语法(property element syntax) 来替换上述的attribute语法。XAML将按钮背景设置为图像而不是简单的纯色。嵌套元素代表图像,元素的attribute指定图像源。
2.4.2 代码中设置属性
在代码中设置依赖属性值通常就是调用由CLR包装器公开的 set 实现:
Button myButton = new ();myButton.Width = 200.0;
获取属性值本质上是调用 get 包装器的实现:
double whatWidth = myButton.Width;
你也可以直接调用属性系统的API GetValue 和 SetValue。直接调用API适用于某些场景,但通常不适用于使用已有的属性。一般来讲,包装器更便捷,并且为开发人员工具提供了更好的属性公开。
属性也可以在XAML中设置,然后通过后置代码访问。
2.5 依赖属性提供的属性功能
与由字段支持的属性不同,依赖属性扩展了属性的功能。通常,扩展的功能如下:
- 资源 Resources
- 数据绑定 Data binding
- 样式 Styles
- 动画 Animations
- 元数据重写 Metadata overrides
- 属性值继承 Property value inheritance
- WPF设计器集成 WPF Designer integration
2.5.1 资源
可以通过引用一个资源来设置属性值。
资源通常被指定为页面根元素或应用程序的 Resources 属性值,因为这些位置提供了对资源的便捷访问。该例中,我们定义了 SolidColorBrush 资源:
现在资源已被定义,我们可以引用该资源来为 Background 属性提供值:
在WPF XAML中,你可以使用静态或动态资源引用。这里,资源被引用为了DynamicResource。动态资源引用只能用于设置依赖属性,因此它是由WPF属性系统专门启用的动态资源引用用法。
注意
资源被视为局部值,这意味着如果你设置了另一个局部值,将会消除资源引用。
2.5.2 数据绑定
依赖属性可以通过数据绑定引用值。数据绑定通过XAML中专有的标记扩展语法或代码中的Binding对象来生效。使用数据绑定,最终属性值的确定被推迟到运行时,那时会从数据源获取值。
下面示例通过使用XAML中声明的绑定来设置Button的 Content 属性。该绑定使用继承的数据上下文和XmlDataProvider数据源(未显示)。绑定本身通过XPath指定数据源内的源属性。
注意
资源被视为局部值,这意味着如果你设置了另一个局部值,将会消除资源引用。
依赖属性和 DependencyObject 类本身并不支持 INotifyPropertyChanged 来通知数据绑定操作的 DependencyObject 源属性值的更改。(即需要使用者自己去继承并实现)
2.5.3 样式
样式和模板是使用依赖属性的有力理由。样式对设置定义应用程序UI的属性尤其有用。
样式通常会定义为XAML中的资源。样式与属性系统交互,因为它们通常包含属性的"setter",和能根据另一属性的运行时值更改属性值的"trigger"。
以下示例创建了一个简单样式,该样式将在Resources字典(未显示)内定义。然后将该样式直接应用于按钮的 Style 属性。样式中的 setter 将样式化的按钮的背景属性设置为绿色。
上一篇:亚马逊里怎么买服务器?