(二)依赖项属性

2017-09-02 19:46:40来源:CSDN作者:wodeshijianhrf人点击

分享
第七城市th7cn

依赖项属性与.NET普通属性

  • 效率更高的保存机制
  • 支持附加功能,如更改通知,属性值继承
  • 是WPF许多重要功能的基础(动画,数据绑定,样式)
  • 在代码中使用方式和普通属性一样

WPF中元素提供的大多数属性都是依赖项属性。依赖项属性是专门针对WPF创建的。


定义依赖项属性

依赖项属性只能为依赖对象添加 (WPF中的元素等大部分基础结构都继承至DependencyObject)

依赖对象指继承至(DependencyObject)的类所定义的对象

  • **定义表示属性的对象(DependencyProperty类的实例)。属性信息应该始终保持可用,
    甚至需要在多个类之间共享这些信息,FrameworkElement 中定义了Margin属性,所有的元素都共享该属性。因此必须需要把DependencyProperty对象定义为与其相关联的类的静态字段。**
// FrameworkElement 中的Margin属性public class FrameworkElement: UIElement,...{    public class readonly DependencyProperty MarginProperty;    ...}
  • 根据约定,定义依赖项属性的字段名称是在普通属性的末尾加Property。由此可区分出依赖项属性和普通属性。

注册依赖性属性

  • DependencyProperty没有public的构造函数,因此不能被直接实例化。实例化需要使用静态的DependencyProperty.Register()等方法创建其的实例。
  • DependencyProperty对象创建后WPF为了不让改变对象,将DependencyProperty成员设置成只读的。他们的值必须使用Register方法的参数来提供。

注册依赖属性需要由两个步骤:
- 创建FrameworkPropertyMetadata 对象。这个对象描述了通过依赖项属性使用什么服务(数据绑定,动画,日志)
- 通过DependencyProperty.Register()静态方法注册属性。

//继续接上面的例子//静态构造函数初始化MarginPropertystatic FrameworkElement(){    //创建FrameworkPropertyMetadata对象    FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata(        new Thickness(),        FrameworkPropertyMetadataOptions.AffectsMeasure //当一个元素的边距发生变化,布局容器就会重新布局,确定元素新布局    );    //注册属性    MarginProperty = DependencyProperty.Register(    "Margin"//属性名    typeof(Thickness), //属性使用的数据结构    typeof(FrameworkElement),//拥有该属性的类型,即当前类名    metadata,//一个具有附加属性设置的FrameworkPropertyMetadata对象,该参数可选    new ValidataValueCallback(FrameworkElement.IsMarginValid) //验证属性的回调函数,可选。    )}

添加属性包装器

使用传统的.Net属性封装WPF依赖项属性。需要使用DependencyObject基类中定义的GetValue()和SetValue()方法。
例子:

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

在上面的例子中不应当添加添加任何验证属性值的额外代码,引发事件的代码。这是因为WPF中的,直接调用SetValue()GetValue()。验证操作应该放在DependencyProperty.ValidateValueCallback回调函数中,事件触发因在FrameworkPropertyMetadata.PropertyChangedCallback回调函数中进行。

下面由三点注意:


  • 依赖属性的包装器是一个CLR属性,初学者容易把包装器认为是依赖属性,依赖属性实际上就是那个由public static readonly修饰的DependencyProperty,有没有包装器这个依赖属性都是存在的。
  • 那么这个包装器是用来干什么的?包装器的作用是以“实例属性”的属性向外界暴露依赖属性,这样使用的时候依赖属性才能成为数据源的一个Path。
    注册依赖属性时使用的第二个参数是一个数据类型,它时包装器的类型,它应该叫依赖属性的注册类型。一般也把它叫依赖属性的类型。但是严格的说依赖属性永远都是DependencyProperty。

第七城市th7cn

相关文章

    无相关信息

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台