我有这个问题,我似乎无法克服。也许有人可以提供帮助。
我正在创建一个动态创建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)))
......但它们都没有奏效。有什么想法来解决这个问题吗?我做错了吗?
提前致谢!
答案 0 :(得分:0)
首先,您不能重新设计系统,以便参数只是属性吗?首先执行您需要处理的所有内容,然后生成PropertyPath
并将其分配给动画。
好的,看起来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);
}