WPF-05 依赖属性

依赖属性原理
提到依赖属性(DependencyProperty),不得不说一下依赖对象(DependencyObject),WPF所有UI控件都是依赖对象,控件的属性则为依赖属性,通过下图可以看到WPF Visual继承DependencyObject,而DependencyObject继承了DispatcherObject.

WPF-05 依赖属性

WPF-05 依赖属性

C#中普通属性(Property)直接从类的私有成员中Get值,依赖属性(DependencyProperty)的值则需要调用依赖对象(DependencyObject)的GetValue方法动态解析,当我们给依赖属性设置值时,没有存储在类的私有成员中,而是存储到依赖对象(DependencyObject)提供的字典中,本质上依赖属性=C#属性+WPF扩展特性

WPF-05 依赖属性

在WPF框架内部使用了大量的依赖属性,我们看一下控件内部定义的依赖属性(下面是Control类的成员):

WPF-05 依赖属性

WPF-05 依赖属性

从上面我们可以看到每个属性对应一个依赖属性,根据WPF的约定依赖属性名称为:属性名+Property ,依赖属性是一个static和readonly的DependencyProperty对象,static静态表示全局可以共享数据,readonly表示只读,表示初始化之后不会改变,我们来看一下 DependencyProperty类型,我们看一下DependencyProperty内部类的成员:

WPF-05 依赖属性

可以看到内部提供Register方法将普通属性注册为依赖属性。

自定义依赖属性

我们可以在类成员中输入propd并且tab回车键,VS会自动为我们生成一个依赖属性。
public int MyProperty{    get { return (int)GetValue(MyPropertyProperty); }    set { SetValue(MyPropertyProperty, value); }}
// Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...public static readonly DependencyProperty MyPropertyProperty =    DependencyProperty.Register("MyProperty", typeof(int), typeof(ownerclass), new PropertyMetadata(0));
可以看出系统为我们自动生成依赖属性,Register方法第一个参数表示属性名称,第二个参数表示属性类型,第三个参数表示当前所属类型,第四个参数表示提供的默认值,Register还提供几个重载方法.

我们在这里对依赖属性有了一个简单的认识,依赖属性背后的逻辑非常复杂和强大,使我们在应用程序减少内存的使用!