必须不同的两个 UserControl 依赖属性
Two UserControl dependency properties that must be different
我正在研究 UserControl
,其中我有 MaximumAngle
和 MinimumAngle
属性。
// 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
方法在处理零时会变得疯狂。
我能用它做什么?
一般来说,您可以采用两种方法来处理这个问题。
方法一
使用强制机制修改值,使它们永远不相等。您可以通过 属性 元数据注册 CoerceValueCallback
。在回调方法中,您可以修改值,例如 adding/subtracting 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
方法的开头添加一个检查,如果两个属性相等 则简单地 return
- 清除所有现有的刻度线并且不创建任何新的刻度线
- 创建与值对应的单个报价单
- 更一般地说——只执行不“发疯”的代码部分,不依赖于“发疯”的代码部分
我个人的建议是采用第二种方法,特别是如果存在此要求不是因为这种状态无效,而是因为它给您带来不便处理。
我正在研究 UserControl
,其中我有 MaximumAngle
和 MinimumAngle
属性。
// 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
方法在处理零时会变得疯狂。
我能用它做什么?
一般来说,您可以采用两种方法来处理这个问题。
方法一
使用强制机制修改值,使它们永远不相等。您可以通过 属性 元数据注册 CoerceValueCallback
。在回调方法中,您可以修改值,例如 adding/subtracting 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
方法的开头添加一个检查,如果两个属性相等 则简单地 return
- 清除所有现有的刻度线并且不创建任何新的刻度线
- 创建与值对应的单个报价单
- 更一般地说——只执行不“发疯”的代码部分,不依赖于“发疯”的代码部分
我个人的建议是采用第二种方法,特别是如果存在此要求不是因为这种状态无效,而是因为它给您带来不便处理。