码迷,mamicode.com
首页 > 其他好文 > 详细

CoerceValueCallback 和 PropertyChangeCallBack

时间:2015-01-31 14:34:31      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:

自定义一个Range类型,利用CoerceValueCallback和PropertyChangeCallback实现三个属性Min,Max,Value,使其效果类似于Slider。Min总小于Max,并且Value总介于Min和Max之间。

 

public class Range : DependencyObject
{
    public int Min
    {
        get { return (int)GetValue(MinProperty); }
        set { SetValue(MinProperty, value); }
    }
    public int Max
    {
        get { return (int)GetValue(MaxProperty); }
        set { SetValue(MaxProperty, value); }
    }
    public int Value
    {
        get { return (int)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }

    public static readonly DependencyProperty MinProperty;
    public static readonly DependencyProperty MaxProperty;
    public static readonly DependencyProperty ValueProperty;

    public static FrameworkPropertyMetadata minMetadata;
    public static FrameworkPropertyMetadata maxMetadata;
    public static FrameworkPropertyMetadata valueMetadata;

    static Range()
    {
        minMetadata = new FrameworkPropertyMetadata();
        maxMetadata = new FrameworkPropertyMetadata(1); // Max的默认值为1
        valueMetadata = new FrameworkPropertyMetadata();

        minMetadata.CoerceValueCallback = MinCoerce;
        maxMetadata.CoerceValueCallback = MaxCoerce;
        valueMetadata.CoerceValueCallback = ValueCoerce;

        minMetadata.PropertyChangedCallback = MinChanged;
        maxMetadata.PropertyChangedCallback = MaxChanged;

        MinProperty = DependencyProperty.Register("Min", typeof(int), typeof(Range), minMetadata);
        MaxProperty = DependencyProperty.Register("Max", typeof(int), typeof(Range), maxMetadata);
        ValueProperty = DependencyProperty.Register("Value", typeof(int), typeof(Range), valueMetadata);
    }

    public static object MinCoerce(DependencyObject d, object baseValue)
    {
        Range range = (Range)d;
        if ((int)baseValue > range.Max)
            return range.Max;
        else
            return (int)baseValue;
    }
    public static object MaxCoerce(DependencyObject d, object baseValue)
    {
        Range range = (Range)d;
        if ((int)baseValue < range.Min)
            return range.Min;
        else
            return (int)baseValue;
    }
    public static object ValueCoerce(DependencyObject d, object baseValue)
    {
        Range range = (Range)d;
        int value = (int)baseValue;

        if (value < range.Min)
            return range.Min;
        else if (value > range.Max)
            return range.Max;
        else
            return value;
    }

    public static void MinChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        Range range = (Range)d;
        range.CoerceValue(Range.MaxProperty); // Coerces the value of Dependcy Property
        range.CoerceValue(Range.ValueProperty);
    }
    public static void MaxChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        Range range = (Range)d;
        range.CoerceValue(Range.MinProperty);
        range.CoerceValue(Range.ValueProperty);
    }
}

 

// 执行以下语句,观察值的变化

Range range = new Range(); //Min=0, Max=1, Value=0
range.Value = 100; //Min=0, Max=1, Value=1
range.Min = 1; //Min=1, Max=1, Value=1
range.Max = 200; //Min=1, Max=200, Value=100

 

执行到最后一句时,当Max属性被改变之后,它会触发对Min和Value的强制。这一强制动作作用于最初设定的值。换句话说,WPF以依赖属性系统仍然保存了本地值100,并且现在该数值是可以接受的,它可以被应用到Value属性。

CoerceValueCallback 和 PropertyChangeCallBack

标签:

原文地址:http://www.cnblogs.com/liuzeyuzh/p/4263931.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!