2017-03-02 41 views
0

我正在致力于UserControl,其中我有MaximumAngleMinimumAngle属性。必须不同的两个UserControl依赖项属性

// 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方法要疯了,当它具有处理为零。

我可以用这个做什么?

+0

使用属性元数据注册[CoerceValueCallback](https://msdn.microsoft.com/en-us/library/system.windows.coercevaluecallback(v = vs.110).aspx)。 – Clemens

+1

您可以使用MSDN页面[依赖属性回调和验证](https://msdn.microsoft.com/en-us/library/ms745795(v = vs.110).aspx)中描述的“ValidateValueCallback” – Rachel

回答

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强制回调将是对称的。

办法之二

处理您CreateTickLines方法这种特殊情况。根据您的控件的目的和实现细节,您可以通过多种方式来实现这一点。这里有几个浮现在我的脑海里(假设我正确地解释你的代码):

  • 什么也不做,即在CreateTickLines方法的开头添加一个检查和简单的返回,如果这两个属性是相同
  • 清除所有现有的剔线并且不创建任何新的
  • 创建与值
  • 相对应的单个对话框
  • 更一般地说 - 只执行不会“发疯”且不依赖于代码部分的代码部分那会“疯了”

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