2017-03-02 43 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方法的開頭添加一個檢查和簡單的返回,如果這兩個屬性是相同
  • 清除所有現有的剔線並且不創建任何新的
  • 創建與值
  • 相對應的單個對話框
  • 更一般地說 - 只執行不會「發瘋」且不依賴於代碼部分的代碼部分那會「瘋了」

我個人的建議是採取第二種方法,特別是如果存在這種要求不是因爲這種狀態是無效的,而是因爲它給你帶來不便。