加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

(二)依赖项属性

发布时间:2020-12-14 01:09:13 所属栏目:百科 来源:网络整理
导读:依赖项属性与.NET普通属性 效率更高的保存机制 支持附加功能,如更改通知,属性值继承 是WPF许多重要功能的基础(动画,数据绑定,样式) 在代码中使用方式和普通属性一样 WPF中元素提供的大多数属性都是依赖项属性。依赖项属性是专门针对WPF创建的。 定义依

依赖项属性与.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()静态方法注册属性。

//继续接上面的例子
//静态构造函数初始化MarginProperty
static 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。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读