两个必须不同的UserControl依赖项属性

时间:2017-03-02 16:09:15

标签: wpf dependency-properties

我正在UserControl处理MaximumAngleMinimumAngle属性。

// MinimumAngle

public double MinimumAngle
{
    get { return (double)GetValue(MinimumAngleProperty); }
    set { SetValue(MinimumAngleProperty, value); }
}
public static readonly DependencyProperty MinimumAngleProperty = DependencyProperty.Register(
    "MinimumAngle", typeof(double), typeof(RoundGauge), new PropertyMetadata((double)0, MinimumAnglePropertyChanged));

private static void MinimumAnglePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    RoundGauge rg = (RoundGauge)d;
    rg.CreateTickLines();
}

// MaximumAngle

public double MaximumAngle
{
    get { return (double)GetValue(MaximumAngleProperty); }
    set { SetValue(MaximumAngleProperty, value); }
}
public static readonly DependencyProperty MaximumAngleProperty = DependencyProperty.Register(
    "MaximumAngle", typeof(double), typeof(RoundGauge), new PropertyMetadata((double)180, MaximumAnglePropertyChanged));

private static void MaximumAnglePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    RoundGauge rg = (RoundGauge)d;
    rg.CreateTickLines();
}

这些属性必须不同,因为我的CreateTickLines方法在必须处理零时会发疯。

我能用这个做什么?

1 个答案:

答案 0 :(得分:2)

通常,您可以采取两种方法来解决此问题。

方法I

使用强制机制修改值,使它们永远不相等。您可以通过属性元数据注册CoerceValueCallback。在回调方法中,您可以修改值,例如,添加/减去double.Epsilon

private static void CoerceMinimumAngle(DependencyObject d, object baseValue)
{
    if(d.GetValue(MaximumAngleProperty).Equals(baseValue))
        return (double)baseValue + double.Epsilon;
    else
        return baseValue;
}

MaximumAngle的强制回调将是对称的。

方法II

CreateTickLines方法中处理此特例。根据控件的用途和实现细节,有许多方法可以实现这一点。这里有几个我想到的(假设我正确地解释了你的代码):

  • 什么也不做,即在CreateTickLines方法的开头添加一个检查,如果两个属性相等则只返回
  • 清除所有现有的刻度线,不要创建任何新的刻度线
  • 创建与值
  • 对应的单个刻度
  • 更一般地说 - 只执行不“疯狂”的代码部分,而不依赖于“疯狂”的代码部分

我个人的建议是采取第二种方法,特别是如果存在这种要求不是因为这种状态无效,而是因为它给你带来不便。