WPF 依赖项属性

WPF中的依赖项属性

“依赖项属性的用途在于提供一种方法来基于其他输入的值计算属性值”,只有定义属性为依赖项属性,这个属性才支持样式设置,数据绑定,继承,动画和默认值。

属性对应的字段必需是公有,静态,只读的,类型为DependencyProperty。即public static readonly DependencyProperty 字段名,同时字段的命名也有规范,属性名+Property,字段在定义时,通过DependencyProperty.Register来实注册属性(只有注册了,才能使用WPF属性系统的服务)。

Register方法有三种重载,如下:


名称


说明


Register(String, Type, Type)


使用指定的属性名称、属性类型和属性所在对象的类型。


Register(String, Type, Type, PropertyMetadata)


使用指定的属性名称、属性类型、属性所在对象的类型和属性元数据注册依赖项属性。


Register(String, Type, Type, PropertyMetadata, ValidateValueCallback)


使用指定的属性名称、属性类型、属性所在对象的类型、属性元数据和属性的值验证回调来注册依赖项属性。

string 依赖属性的名字,即字段的名字

1 Type  属性的类型

2 Type 属性所属对象的类型

PropertyMetadata:依赖项对象的属性元数据,是一个PropertyMetadata类型,可能赋初始值。PropertyMetadata有一个object的构造函数;

ValidateValueCallback:表示用作回调的方法,这个类型是一个委托,用于验证依赖项属性的值的有效性,因为是委托,故它的构造参数为一个方法名。

下文中代码基本构成为:

class MyClass : DependencyObject{
        public static readonly DependencyProperty MyfieldProperty = DependencyProperty.Register("Myfield", typeof(int), typeof(MyClass), new PropertyMetadata(0), new ValidateValueCallback(new MyClass().MyValidateMethod));
        public int Myfield
        {
            get { return (int)GetValue(MyfieldProperty); }
            set { SetValue(MyfieldProperty, value); }
        }
        public bool MyValidateMethod(object value)
        {
            return true;//这里实现验证
        }
 }

理解依赖项属性

依赖项属性是标准的全新实现,WPF提供的大多数属性都是依赖项属性。依赖项属性是专门针对WPF创建的。但WPF库中的依赖项属性都使用普通的.Net属性过程进行了封装。

定义依赖项属性

只能为依赖对象(继承自DependencyObject类)添加依赖项属性

第一步是定义表示属性的对象,它是dependencyProperty类的实例,比如

定义的依赖项属性的字段的名称是在普通属性的末尾处加上单词Property

字段的定义使用了readonly关键字,这意味着只能在Framework类的静态构造函数中对其进行设置

注册依赖项属性

为了使用依赖项属性,还需要使用WPF注册创建的依赖项属性

WPF确保DependencyProperty对象不能被直接实例化,因为它没有公有的构造函数

添加属性包装器

最后一个步骤就是用传统的.Net属性封装WPF依赖项属性

而WPF属性的属性过程是使用在DependencyObject基类中定义的GetValue和SetValue方法

public Thickness Margin{
            set { SetValue(MarginProperty,value); }
            get { return (Thickness)GetValue(MarginProperty); }
}

但创建属性封装器时,应当只包含对SetValue和GetValue方法的调用

共享的依赖项属性

尽管一些类具有不同的继承层次,但它们会共享同一依赖项属性,比如:TextBlock.FontFamily属性和Control.FontFamily属性指向同一个静态的依赖项属性,该属性实际上是在TextElement类中定义的TextElement.FontFamilyProperty依赖项属性。

通过调用:

附加的依赖项属性

属性验证

在定义任何类型的属性时,都需要面对错误设置属性的可能性。对于依赖项属性来说,有两种方法阻止非法值:

CoerceValueCallback方法有机会修改提供的值(通常,使提供的值和其他属性相容)或者返回Dependency.UnsetValu,这会完全拒绝修改。

接下来激活ValidateValurCallback方法。该方法返回true以接受一个值作为合法值,或者返回false拒绝值,与Coerce方法不同,validateValueCallback方法不能访问设置属性的实际对象,这意味着你不能检查其他属性值。

如果上面的都成功,就会触发PropertyChangedCallback方法。此时,如果希望为其他类提供通知,可以引发更改事件。

原文地址:https://www.cnblogs.com/yinghualuowu/p/9409654.html

时间: 2024-10-10 22:24:16

WPF 依赖项属性的相关文章

对WPF依赖项属性的理解

属性和事件是.NET抽象模型的核心部分, 而WPF中则用更高级的依赖项属性(Dependency Property)代替了原来.NET中的属性.依赖项属性主要应用于自定义元素中,用于为自定义元素注入自定义的属性. 以下是定义和注册依赖项属性的方法: //声明并注册依赖项属性 FoodProperty public static DependencyProperty FoodProperty =      DependencyProperty.Register("Food", typeo

学习WPF——初识依赖项属性

入门 首先创建一个依赖项属性 然后绑定父容器的DataContext到这个依赖项的实例 接着绑定子元素的属性到依赖项属性(注意Button的Content属性) 程序最终的运行结果: 说明 首先是定义表示属性的对象,一个依赖项属性的对象必然是DependencyProperty的实例 这个实例必须始终保持可用,所以这里定义为静态字段 根据约定,依赖项属性的字段名称使用Property结尾,上面例子使用的是NameProperty 依赖项属性实例的创建工作必须在使用之前完成,所以要么在定义的时候即

WPF学习系列之二 (依赖项属性)

依赖属性;(dependency property)  它是专门针对WPF创建的,但是WPF库中的依赖项属性都使用普通的.NET属性过程进行了包装.从而可能通过常规的方式使用它们,即使使用他们的代码不理解WPF依赖项属性系统也是如此,使用旧技术包装新技术看起来有些奇怪,但这正是WPF能够改变基础组成部分,而不会扰乱.NET领域中其他部分的原因.三步:一:定义依赖项属性.public static readonly DependencyProperty MarginProperty;二:.在静态构

【WPF学习】第十一章 理解依赖项属性

依赖项属性是标准.NET属性的全新实现——具有大量新增价值.在WPF的核心特性(如动画.数据绑定以及样式)中需要嵌入依赖项属性.WPF元素提供的大多数属性都是依赖项属性.到目前位置所见到的所有示例都用到了依赖项属性,但你可能还没有意识到这一点.这是因为依赖项属性的用法和普通属性的是相同的. 然而,依赖项属性并非普通属性.可能乐意认为依赖项属性是添加了一套WPF功能的常规属性(采用典型的.NET方式进行定义).从概念上讲,依赖项属性确实以这种方式工作,但它们的背后的实现方式并非如此.原因十分简单:

WPF编程宝典之依赖项属性(八)

依赖项属性是专门针对WPF创建的,但WPF库中的依赖项属性都使用普通的.NET属性过程(property procedure)进行了封装. 1.定义依赖项属性 注:只能为依赖对象(继承自DependencyObject的类)添加依赖项属性.幸运的是,WPF基础结构的关键部分中的大部分都间接继承自DependencyObject类,最明显的例子就是元素. 依赖项属性需要在多个类之间共享信息,所以必须将DependencyProperty对象定义为与其相关联的类的静态字段.并且按照约定,依赖项属性的

WPF学习之依赖项属性

依赖项属性-依赖属性 Register(String, Type, Type) 使用指定的属性名称.属性类型和属性所在对象的类型.Register(String, Type, Type, PropertyMetadata) 使用指定的属性名称.属性类型.属性所在对象的类型和属性元数据注册依赖项属性.Register(String, Type, Type, PropertyMetadata, ValidateValueCallback) 使用指定的属性名称.属性类型.属性所在对象的类型.属性元数据

WPF的依赖项属性

WPF的依赖项属性 属性与事件是.NET抽象模型的核心部分.WPF使用了更高级的依赖项属性(Dependency Property)功能来替换原来.NET的属性,实现了更高效率的保存机制,还添加了附加功能,如属性变更通知以及强制回调.属性值继承(在逻辑树中向下传播默认属性值的能力)以及属性有效性验证等.同时,依赖项属性也是WPF许多重要功能的基础,包括动画.数据绑定以及样式. 依赖项属性的使用基础 使用依赖项属性包括三个部分,定义依赖项属性:注册依赖项属性以及添加属性包装器. 定义依赖项属性,使

什么是依赖项属性?(在练习使用StoryBoard故事板时,遇到的问题)

概述: Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR) 属性的功能.这些服务通常统称为 WPF 属性系统.由 WPF 属性系统支持的属性称为依赖项属性. 依赖项属性提供用来扩展属性功能的功能, 最常用的莫过于"数据绑定"功能,依赖项属性可以通过数据绑定来引用值.数据绑定通过特定的标记扩展语法(在 XAML 中)或 Binding 对象(在代码中)来工作.使用数据绑定,最终属性值的确定将延迟到运行时

三,依赖项属性

定义依赖项属性 public class FrameworkElement : UIElement { public static readonly DependencyProperty MarginProperty; static FrameworkElement() { FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata(new Thickness(), FrameworkPropertyMetadataOpt