依赖项属性(Pro WPF学习)

1、定义依赖项属性

需要创建依赖项属性的地方:自定义WPF元素时;为不支持数据绑定动画其他WPF功能的部分代码添加这些功能时。

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

属性信息应该始终保持可用,甚至需要在多个类之间共享这些信息,因此,必须将Dependency Property对象定义为与之相关联的类的静态字段。

public class SpaceButton : Button
{    
    public static readonly DependencyProperty SpaceProperty;
    ......
}

2、注册依赖项属性

  需要在任何使用属性的代码之前完成,因此必须在与之关联的类的静态构造函数中进行。

       注册一个依赖项属性需要两步:首先创建一个FrameworkPropertyMetadata对象,该对象指示希望通过依赖项属性使用什么服务(如支持数据绑定、动画及日志)。接下来通过调用DependencyProperty.Register()静态方法注册属性。

3、添加属性包装器

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

public class SpaceButton : Button
{
    private string text;
    public string Text
    {
        get { return text; }
        set
        {
            text = value;
            Content = SpaceOutText(text);
        }
    }

    //依赖属性
    public static readonly DependencyProperty SpaceProperty;

    //.net属性包装器
    public int Space
    {
        set { SetValue(SpaceProperty, value); }
        get { return (int)GetValue(SpaceProperty); }
    }

    //静态构造函数
    static SpaceButton()
    {
        //定义元数据
        FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata();
        metadata.DefaultValue = 0;
        metadata.PropertyChangedCallback += OnSpacePropertyChanged;

        //继承。为true表示会通过元素树传播该依赖项属性值,并可以被嵌套的元素继承。如Font属性是一个可继承的依赖项属性,
        //如果在一个更高层次的元素中设置了Font属性值,则该属性会被嵌套的元素继承(除非使用自己的字体设置明确覆盖继承来的值)
        metadata.Inherits = true;

        //注册依赖项(属性名,属性使用的数据类型,该属性拥有者的类型,
        //一个具有附加属性设置的FrameworkPropertyMetadata对象[可选的]。
        //一个用于验证属性的回调函数[可选的])
        SpaceProperty = DependencyProperty.Register("Space", typeof(int), typeof(SpaceButton), metadata, ValidateSpaceValue);
    }

    //验证属性值的回调函数
    static bool ValidateSpaceValue(Object obj)
    {
        int i = (int)obj;
        return i >= 0;
    }

    //属性值改变的回调函数
    static void OnSpacePropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        SpaceButton btn = obj as SpaceButton;
        string text = btn.Content as string;
        if (text == null) return;
        btn.Content = btn.SpaceOutText(text);
    }

    //该方法为字符间距添加空格
    string SpaceOutText(string text)
    {
        if (text == null)
            return null;
        StringBuilder build = new StringBuilder();
        foreach (char c in text)
        {
            build.Append(c + new string(' ', Space));
        }
        return build.ToString();
    }        
}

 

原文地址:https://www.cnblogs.com/yxhq/p/2581860.html