0

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

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

问题是,我需要插入两种类型的 PropertyPath:PlaneProjection.RotationYPropertyControl.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)))

...但他们都没有工作。有什么想法可以解决这个问题吗?难道我做错了什么?

提前致谢!

4

3 回答 3

0

首先,你不能重新设计系统,让论点只是属性吗?首先对属性做所有你需要做的事情,然后生成PropertyPath并将其分配给动画。

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

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

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

于 2013-06-27T12:44:20.760 回答
0

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

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

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

然后你只需要直接用你的属性调用它:

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

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

于 2013-06-27T16:34:36.330 回答
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);
}
于 2013-06-28T08:43:29.677 回答