得鹿梦鱼 得鹿梦鱼

WPF依赖项属性和路由事件

依赖项属性(Dependency Property)

Windows Presentation Foundation WPF 提供了一组服务,这些服务可用于扩展公共语言运行时 CLR 属性的功能。这些服务通常统称为 WPF 属性系统。由 WPF 属性系统支持的属性称为依赖项属性。本概述介绍 WPF 属性系统以及依赖项属性的功能,这包括如何在可扩展应用程序标记语言 XAML 中和代码中使用现有的依赖项属性。
依赖项属性的用途在于提供一种方法来基于其他输入的值计算属性值。这些其他输入可以包括系统属性(如主题和用户首选项)、实时属性确定机制(如数据绑定和动画/演示图板)、重用模板(如资源和样式)或者通过与元素树中其他元素的父子关系来公开的值。另外,可以通过实现依赖项属性来提供独立验证、默认值、监视其他属性的更改的回调以及可以基于可能的运行时信息来强制指定属性值的系统。派生类还可以通过重写依赖项属性元数据(而不是重写现有属性的实际实现或者创建新属性)来更改现有属性的某些具体特征。

  • 依赖项属性与CLR 包装属性
// 通过包装的属性设置按钮的背景颜色btn_ButtonC.Background = new SolidColorBrushColors.Red;// 通过依赖性属性的SetValue设置按钮的背景颜色SolidColorBrush brush = new SolidColorBrushColors.Blue;btn_ButtonD.SetValueButton.BackgroundProperty, brush;// 通过包装的属性获取ButtonB的背景颜色SolidColorBrush b_Brush1 = SolidColorBrush btn_ButtonB.Background;txt_Value1.Text = b_Brush1.Color.ToString;// 通过依赖性属性的GetValue获取ButtonB的背景颜色SolidColorBrush b_Brush2 = SolidColorBrush btn_ButtonB.GetValueButton.BackgroundProperty;txt_Value2.Text = b_Brush2.Color.ToString;
  • 使用由依赖项属性提供的属性功能

依赖项属性提供用来扩展属性功能的功能,这与字段支持的属性相反。每个这样的功能通常都表示或支持整套WPF功能中的特定功能:资源数据绑定样式动画元数据重写属性值继承WPF设计器集成

  • 自定义依赖项属性及重写依赖项属性

对于自定义依赖项属性,其所在的类型必须直接或间接继承System.Windows.DependencyObject类,依赖项属性是通过调用 Register 方法(或 RegisterReadOnly,自定义的只读的依赖项属性)在 WPF 属性系统中注册,并通过 DependencyProperty 标识符字段备份的属性。依赖项属性只能由 DependencyObject 类型使用,但 DependencyObject 在 WPF 类层次结构中的级别很高,因此,WPF 中的大多数可用类都支持依赖项属性。在对依赖项属性及CLR包装属性命名时必须满足:CLR包装属性名+Property=依赖项属性名。

public static readonly DependencyProperty AquariumGraphicProperty = DependencyProperty.Register    "AquariumGraphic",              // 要注册的依赖项对象的名称    typeofUri,                    // 属性的类型    typeofAquariumObject,         // 正注册依赖项对象的所有者类型    new FrameworkPropertyMetadata  // 依赖项对象的属性元数据    null,    FrameworkPropertyMetadataOptions.AffectsRender,    new PropertyChangedCallbackOnUriChanged    ;public Uri AquariumGraphic{    get { return UriGetValueAquariumGraphicProperty; }    set { SetValueAquariumGraphicProperty, value; }}

路由事件(RoutedEvent)

路由事件的处理模型常用的有三种

  • 冒泡事件:由子控件位次向父容器传递,大部分的路由事件都是冒泡事件
  • 隧道事件:由父容器位次向其子容器、控件传递,一般PreXXX事件属性隧道事件
  • 直接