WPF 依赖属性

概念

依赖属性就是自己自己没有值,通过Binding从数据源获得值,就是依赖在别人身上,拥有依赖属性的对象称为依赖对象

应用依赖属性的场景

1、在样式中设置属性。
2、属性支持数据绑定。
3、使用动态资源引用设置属性。
4、从元素树中的父元素自动继承属性值。
5、属性可进行动画处理。
6、属性系统在属性系统、环境或用户执行的操作或者读取并使用样式更改了属性以前的值时报告。
7、使用已建立的、WPF 进程也使用的元数据约定,
例如报告更改属性值时是否要求布局系统重新编写元素的可视化对象。依赖对象创建时并不包含存储数据空间。WPF中必须使用依赖对象作为依赖属性的宿主。

用于数据绑定

依赖属性是针对一个类的静态属性
每个类实例去这个静态属性里面Get属于自己的那一个属性

对象有属性,属性的值去公共数据区域【所有类实例的依赖属性都放在一个静态变量(公共区域)里面】里面取
优势:公共数据区域不在UI线程,所以可以随时修改数值

Tips

WPF界面元素为依赖对象,所有属性为依赖属性,所以支持绑定

 
 

 

示例

自定义控件

public class CustomBorder : Border
{
    public CustomBorder()
    {
        //初始化时默认给定一个背景色 
        Background = Brushes.Blue;
    }
    

    //属性
    public Double Transparency
    {
        get { return (Double)GetValue(TransparencyDependency); }
        set { SetValue(TransparencyDependency, value); }
    }

    //注册依赖属性
    public readonly static DependencyProperty TransparencyDependency =
        DependencyProperty.Register( 
        //属性名
        "Transparency",
        //属性数据类型
        typeof(Double),
        //拥有者
        typeof(CustomBorder),
        //处理方法
        new PropertyMetadata(new PropertyChangedCallback(transparencyPropertyChangedCallback))
        );

    //当属性修改时的处理
    static void transparencyPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        CustomBorder border = (sender as CustomBorder);
        if (border != null)
        {
            border.Opacity = 1 - Convert.ToDouble(e.NewValue) / 255;
        }
    }
}

DependencyProperty的Register方法

有几种重载方法,下面展示两种

 

 

//
// 摘要:
//     使用指定的属性名称、属性类型、所有者类型和属性元数据注册依赖属性。
//
// 参数:
//   name:
//     要注册的依赖属性的名称。
//
//   propertyType:
//     属性的类型。
//
//   ownerType:
//     正在注册依赖属性的所有者类型。
//
//   typeMetadata:
//     依赖属性的属性元数据。
//
// 返回结果:
//     一个依赖属性标识符,应使用它来设置类中 public static readonly 字段的值。 稍后将此标识符用来引用依赖属性,从而实现以编程方式设置其值或获取元数据等操作。
public static DependencyProperty Register(string name, Type propertyType, Type ownerType, PropertyMetadata typeMetadata);

前台

<Grid>
    <local:CustomBorder x:Name="bord" Transparency="{Binding ElementName=slider1, Path=Value}"></local:CustomBorder>
    <Slider Grid.Row="1" HorizontalAlignment="Left" Name="slider1" Width="130" Value="0" Minimum="0" Maximum="255" />
</Grid>

示例代码

https://github.com/zLulus/NotePractice/tree/dev3/WPF/WpfDemo/DependencyProperties

posted @ 2017-12-29 17:53  Lulus  阅读(841)  评论(0编辑  收藏  举报