【WPF】WPF 属性

依赖项属性
Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行库 (CLR) 属性的功能。
这些服务通常统称为 WPF 属性系统。
由 WPF 属性系统支持的属性称为依赖项属性。

依赖项属性的用途在于提供一种方法来基于其他输入的值计算属性值。
这些其他输入可以包括
            系统属性(如主题和用户首选项)、
            实时属性确定机制(如数据绑定和动画/演示图板)、
            重用模板(如资源和样式)
            或者通过与元素树中其他元素的父子关系来公开的值。
另外,可以通过实现依赖项属性来提供独立验证、默认值、监视其他属性的更改的回调以及可以基于可能的运行时信息来强制指定属性值的系统。
派生类还可以通过重写依赖项属性元数据(而不是重写现有属性的实际实现或者创建新属性)来更改现有属性的某些具体特征。


下面汇集了在本软件开发工具包 (SDK) 文档中,在讨论依赖项属性时所使用的术语:

  • 依赖项属性:一个由 DependencyProperty 支持的属性。

  • 依赖项属性标识符:一个 DependencyProperty 实例,在注册依赖项属性时作为返回值获得,之后将存储为一个类成员。在与 WPF 属性系统交互的许多 API 中,此标识符用作一个参数。

  • CLR“包装”:属性的实际 get 和 set 实现。这些实现通过在 GetValueSetValue 调用中使用依赖项属性标识符来合并此标识符,从而使用 WPF 属性系统为属性提供支持。


附加属性
附加属性是可扩展应用程序标记语言 (XAML) 定义的一个概念。
附加属性旨在用作可在任何对象上设置的一类全局属性。
在 Windows Presentation Foundation (WPF) 中,附加属性通常定义为没有常规属性“包装”的一种特殊形式的依赖项属性。

附加属性是一种类型的属性,它支持 XAML 中的专用语法。
附加属性通常与公共语言运行库 (CLR) 属性不具有 1:1 对应关系,而且不一定是依赖项属性。
附加属性的典型用途是使子元素可以向其父元素报告属性值,即使父元素和子元素的类成员列表中均没有该属性也是如此。
一个主要方案是,使子元素可以将其在 UI 中的表示方式通知给父级;

在 Windows Presentation Foundation (WPF) 中,WPF 类型上存在的大多数附加属性都实现为依赖项属性。
附加属性是一个 XAML 概念,而依赖项属性则是一个 WPF 概念。
因为 WPF 附加属性是依赖项属性,所以它们支持依赖项属性概念,例如,属性元数据以及这些属性元数据中的默认值。

尽管可以在任何对象上设置附加属性,但这并不自动意味着设置该属性会产生实际的结果,或者该值将会被其他对象使用。
通常,附加属性是为了使来自各种可能的类层次结构或逻辑关系的对象都可以向所属类型报告公用信息。
定义附加属性的类型通常采用以下模型之一:

  • 设计定义附加属性的类型,以便它可以是将为附加属性设置值的元素的父元素。之后,该类型将在内部逻辑中循环访问其子元素,获取值,并以某种方式作用于这些值。

  • 定义附加属性的类型将用作各种可能的父元素和内容模型的子元素。

  • 定义附加属性的类型表示一个服务。其他类型为该附加属性设置值。之后,当在服务的上下文中计算设置该属性的元素时,将通过服务类的内部逻辑获取附加属性的值。

如果您的类将附加属性严格定义为用于其他类型,那么该类不必从 DependencyObject 派生。
但是,如果您遵循使附加属性同时也是一个依赖项属性的整体 WPF 模型,则需要从 DependencyObject 派生。

通过声明一个 DependencyProperty 类型的 public static readonly 字段将附加属性定义为一个依赖项属性。
通过使用 RegisterAttached 方法的返回值来定义此字段。
为了遵循命名标识字段及其所表示的属性的已建立 WPF 模式,字段名必须与附加属性名一致,并附加字符串 Property
附加属性提供程序还必须提供静态的 Get属性名 和 Set属性名 方法作为附加属性访问器,否则会导致属性系统无法使用您的附加属性。

posted @ 2008-04-21 13:49  宁#宁  阅读(743)  评论(0编辑  收藏  举报