对自定义依赖项属性值进行一些数学计算

时间:2016-06-27 17:09:46

标签: wpf

我有三个依赖属性。 TestControlHeight,HalfValue1和HalfValue2。现在,根据这三个值我必须计算 第三个值,将被指定为内部控件的高度,也将是依赖属性。

内部控制的高度= TestControlHeight /(HalfValue1 - HalfValue2);

在哪里可以编写此代码来计算内部控件的高度(也是依赖属性)

 public static readonly DependencyProperty TestControlHeightProperty =
        DependencyProperty.Register("TestControlHeight", typeof (double), 
 typeof (TestControl), new PropertyMetadata(default(double)));

    public double TestControlHeight
    {
        get { return (double) GetValue(TestControlHeightProperty); }
        set { SetValue(TestControlHeightProperty, value); }
    }

    public static readonly DependencyProperty HalfValue1Property =
        DependencyProperty.Register("HalfValue1", typeof (double), typeof
   (TestControl), new PropertyMetadata(default(double)));

    public double HalfValue1
    {
        get { return (double) GetValue(HalfValue1Property); }
        set { SetValue(HalfValue1Property, value); }
    }

    public static readonly DependencyProperty HalfValue2Property =
        DependencyProperty.Register("HalfValue2", typeof (double), typeof 
  (TestControl), new PropertyMetadata(default(double)));

    public double HalfValue2
    {
        get { return (double) GetValue(HalfValue2Property); }
        set { SetValue(HalfValue2Property, value); }
    }

谢谢&的问候,

1 个答案:

答案 0 :(得分:1)

来自WPF Unleashed书:

在设置依赖项属性时,会在运行时绕过.NET属性包装器 在XAML中! 虽然XAML编译器在编译时依赖于属性包装器,但WPF在运行时直接调用底层的GetValue和SetValue方法!因此,为了在XAML和过程代码中设置属性之间保持奇偶校验,除了GetValue / SetValue调用之外,属性包装器不包含任何逻辑是至关重要的。

如果要添加自定义逻辑,那就是注册的回调所针对的。所有WPF的内置属性包装器都遵守此规则,因此,此警告适用于编写具有自己的依赖项属性的自定义类的任何人。

所以,你的代码看起来像这样(未经测试):

    public static readonly DependencyProperty TestControlHeightProperty =
    DependencyProperty.Register("TestControlHeight", typeof(double), typeof(TestControl),
            new PropertyMetadata(false, new PropertyChangedCallback(OnHeightChanged)));

    public double TestControlHeight
    {
        get { return (double)GetValue(TestControlHeightProperty); }
        set { SetValue(TestControlHeightProperty, value); }
    }

    public static readonly DependencyProperty HalfValue1Property =
        DependencyProperty.Register("HalfValue1", typeof(double), typeof(TestControl),
            new PropertyMetadata(false, new PropertyChangedCallback(OnHeightChanged)));


    public double HalfValue1
    {
        get { return (double)GetValue(HalfValue1Property); }
        set { SetValue(HalfValue1Property, value); }
    }

    public static readonly DependencyProperty HalfValue2Property =
        DependencyProperty.Register("HalfValue2", typeof(double), typeof(TestControl),
            new PropertyMetadata(false, new PropertyChangedCallback(OnHeightChanged)));


    public double HalfValue2
    {
        get { return (double)GetValue(HalfValue2Property); }
        set { SetValue(HalfValue2Property, value); }
    }

    public double MyInnerControlHeight
    {
        get { return (double)GetValue(MyInnerControlHeightPropertyProperty); }
        set { SetValue(MyInnerControlHeightPropertyProperty, value); }
    }

    public static readonly DependencyProperty MyInnerControlHeightPropertyProperty =
        DependencyProperty.Register("MyInnerControlHeightProperty", typeof(double), typeof(TestControl),
            new PropertyMetadata(0));

    private static void OnHeightChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var testControl = d as TestControl;
        if (testControl != null)
        {
            testControl.MyInnerControlHeight = testControl.TestControlHeight / (testControl.HalfValue1 - testControl.HalfValue2);
        }

    }