比较PropertyPath值

时间:2013-06-27 12:25:46

标签: c# windows-phone-7 animation

我有这个问题,我似乎无法克服。也许有人可以提供帮助。

我正在创建一个动态创建DoubleAnimations的方法。我会从数组中提供一组不同的用户控件,它会自动创建DoubleAnimations以添加到StoryBoard。

问题是,我需要插入两种类型的PropertyPath: PlaneProjection.RotationYProperty Control.OpacityProperty 。我必须为它们设置 Storyboard.SetTarget ,所以我需要一种方法来比较我在我的方法中调用TargetProperty的PropertyPath参数。这里解释一下我在代码中尝试做的事情:

if (TargetProperty == new PropertyPath (PlaneProjection.RotationYProperty))
{
    // Do some code
    projection = control.Projection as PlaneProjection;
    Storyboard.SetTarget(doubleAnimation, projection);
}
else if (TargetProperty == new PropertyPath (Control.OpacityProperty))
{
    Storyboard.SetTarget(doubleAnimation, control);
}

我能够通过使用bool作为解决方法开关来使我的方法工作,但如果可能的话,我仍然希望减少方法中的参数数量。

我尝试过使用:

if (TargetProperty.ToString() == new PropertyPath (PlaneProjection.RotationYProperty).ToString())

......和......

if (TargetProperty.Equals(new PropertyPath (PlaneProjection.RotationYProperty)))

......但它们都没有奏效。有什么想法来解决这个问题吗?我做错了吗?

提前致谢!

3 个答案:

答案 0 :(得分:0)

首先,您不能重新设计系统,以便参数只是属性吗?首先执行您需要处理的所有内容,然后生成PropertyPath并将其分配给动画。

<德尔> 在此之前,您可以尝试比较`Path`属性:     if(TargetProperty.Path == new PropertyPath(dependencyProperty).Path)

好的,看起来Path只会在通过将字符串传递给构造函数创建PropertyPath时才匹配。

还有另一种方法可以在WPF中比较它们,但它在Silverlight中不可用:路径数据位于名为PathParameters的数组中,该数组将在PropertyPath的两个实例之间具有匹配的元素通过将相同的依赖属性传递给它们的构造函数。 Silverlight不允许你访问PathParameters,所以除非在某个地方有另一个帮助方法(我看了PropertyPathConverter但它看起来不会有帮助),你唯一的选择(除了反射)是为了消除比较路径的需要。

答案 1 :(得分:0)

如果您在两种情况下都使用相同的逻辑来创建动画,请直接将target属性传递给您的方法:

public void AssignAnimation(DependencyObject property)
{
    // Create the doubleAnimation
    // ...

    // Assign it
    Storyboard.SetTarget(doubleAnimation, property);
}

然后你只需要直接用你的财产来称呼它:

AssignAnimation(control);
AssignAnimation(control.Projection);

如果您使用的是不同的逻辑,那么我建议您使用两种不同的方法。您的代码将更易于阅读和维护。

答案 2 :(得分:0)

在KooKiz建议我使用DependencyObject之后,我意识到我可以使用DependencyProperty而不是PropertyPath,然后我会尝试进行比较。正如nmclean所提到的,似乎比较PropertyPath对象是不可能的 - 至少在我的情况下是这样。然后我的代码变成了这样的东西,它现在就像一个魅力:

if (TargetProperty == PlaneProjection.RotationYProperty)
{
    // Do some code
    projection = control.Projection as PlaneProjection;
    Storyboard.SetTarget(doubleAnimation, projection);
}
else if (TargetProperty == Control.OpacityProperty)
{
    Storyboard.SetTarget(doubleAnimation, control);
}