Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 两个必须不同的UserControl依赖项属性_Wpf_Dependency Properties - Fatal编程技术网

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

Wpf 两个必须不同的UserControl依赖项属性,wpf,dependency-properties,Wpf,Dependency Properties,我正在处理UserControl中的MaximumAngle和MinimumAngle属性 // MinimumAngle public double MinimumAngle { get { return (double)GetValue(MinimumAngleProperty); } set { SetValue(MinimumAngleProperty, value); } } public static readonly DependencyProperty Mini

我正在处理
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
方法在必须处理零时会变得疯狂


我能做些什么?

一般来说,有两种方法可以解决这个问题

方法一 使用强制机制修改值,使它们永远不相等。您可以通过属性元数据注册
强制值回调
。在回调方法中,您可以通过添加/减去
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
    方法的开头添加一个检查,如果两个属性相等,只需返回即可
  • 清除所有现有的刻度线,不创建任何新的刻度线
  • 创建一个与该值对应的记号
  • 更一般地说,只执行代码中不“发疯”的部分,不依赖于代码中“发疯”的部分

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

一般来说,您可以采取两种方法来处理此问题

方法一 使用强制机制修改值,使它们永远不相等。您可以通过属性元数据注册
强制值回调
。在回调方法中,您可以通过添加/减去
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
    方法的开头添加一个检查,如果两个属性相等,只需返回即可
  • 清除所有现有的刻度线,不创建任何新的刻度线
  • 创建一个与该值对应的记号
  • 更一般地说,只执行代码中不“发疯”的部分,不依赖于代码中“发疯”的部分

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

使用属性元数据注册a。您可能会使用MSDN页面上描述的
ValidateValueCallback
使用属性元数据注册a。您可能会使用MSDN页面上描述的
ValidateValueCallback