如何创建从两个其他属性获取值的依赖项属性

时间:2010-11-20 12:19:45

标签: c# wpf dependency-properties

我在桌面上制作移动窗口的动画。我找到了一些信息,其中最好的方法是创建自己的属性并分别为Left和Top设置动画。

问题是这个属性是用值(0,0)初始化的。我希望我的属性从窗口的顶部和左侧获取值,并设置它。

我的财产:

public static readonly DependencyProperty PositionProperty = DependencyProperty.Register("Position", typeof(Point), typeof(MainCard), 
        new PropertyMetadata(PositionPropertyChanged) );

private static void PositionPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs prop)
{
    MainCard mw = (MainCard)dependencyObject;
    Point value = (Point)prop.NewValue;

    mw.Top = value.Y;
    mw.Left = value.X;
}

public Point Position
{
    get
    {
        return (Point)GetValue(PositionProperty);
    }
    set
    {
        SetValue(PositionProperty, value);
    }
}

2 个答案:

答案 0 :(得分:1)

结帐MultiBindingIMultiValueConverter。这将允许您绑定到两个源属性并将它们转换为您的位置的单个值。


编辑:听起来你真正想要做的就是动画一个Point而不是分离Left和Top值,所以这可能不适用于你的情况。这里真正的问题是你有双向问题;此属性表示与Top和Left相同的信息,因此如果您更改它,则Top和Left应该更改。同样,由于Top和Left是可变的,如果这些变化,你真的希望你的财产能够反映出来。

一个选项是为LeftProperty和TopProperty注册属性更改处理程序。现在,当这些更改时,请更新您的PositionProperty。你必须要小心,不要触发重复更新(我改变左,改变位置,改变左,这......)

答案 1 :(得分:1)

我真的不明白你想要达到的目的但是......这是我对你的问题的看法:

  • 首先,您不能将属性的“默认”值放在窗口的顶部/左侧值,因为它只在runting时知道,而属性的“默认”值必须在编译时提供时间。
  • 所以基本上,你需要的是在拥有它时(例如在窗口的“show()”方法中)设置你的属性的值,如下所示:

    myMainCard.SetCurrentValue(MainCard.PositionProperty,new Point(){X = myWindow.Left,Y = myWindow.Top});