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

C# 如何创建从其他两个属性获取值的依赖性属性,c#,wpf,dependency-properties,C#,Wpf,Dependency Properties,我正在制作桌面上移动窗口的动画。我在某个地方发现,最好的方法是创建自己的属性并设置它的动画,而不是将其左上方分开 问题在于此属性是用值(0,0)初始化的。我希望我的属性从窗口的顶部和左侧获取值,并进行设置 我的财产: public static readonly DependencyProperty PositionProperty = DependencyProperty.Register("Position", typeof(Point), typeof(MainCard),

我正在制作桌面上移动窗口的动画。我在某个地方发现,最好的方法是创建自己的属性并设置它的动画,而不是将其左上方分开

问题在于此属性是用值(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);
    }
}
退房并离开。这将允许您绑定到两个源属性,并将它们转换为位置的单个值


编辑:听起来你真正想做的是设置一个点的动画,而不是分开左值和顶值,所以这可能不适用于你的情况。这里真正的问题是你有一个双向的问题;此属性表示与“顶部”和“左侧”相同的信息,因此如果您更改它,则“顶部”和“左侧”应该会更改。同样,由于Top和Left是可变的,如果它们发生了变化,您真的希望您的属性反映出这一点


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

我真的不明白您想要实现什么,但是。。。以下是我对你的问题的看法:

  • 首先,您不能将属性的“默认”值放在窗口的左上角,因为只有在运行时才知道它,而属性的“默认”值必须在编译时提供
  • 因此,基本上,您需要设置您的产权的值(例如在窗口的“show()”方法中),如下所示:

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


我也会推荐这一点事实上,我刚刚意识到我的回答没有抓住OP问题的重点。Thakns Dan,我希望有其他方法可以做到这一点。看看这里:你是对的,但是当你移动窗口时,值应该是changedwell,然后你只需捕获“LocationChanged”事件,并将更改传播到主卡。。。但是最好使用Dan的解决方案和绑定,这样会更容易