2013-06-27 86 views
0

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

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

的事情是,我需要插入两种类型PropertyPaths的: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); 
} 

我能够通过使用布尔作为一种解决方法开关,使我的方法工作,但我还是宁愿减少参数的个数在我的方法中,如果可能的话。

我已经尝试使用:

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

......还有......

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

...但他们没有工作。任何想法来解决这个问题?难道我做错了什么?

在此先感谢!

+0

你需要'control'创建'doubleAnimation',还是仅仅用于'Storyboard.SetTarget'? –

+0

'control'可以是我想要动画的任何用户控件。 'projection'就是这个控制器的'PlaneProjection'。是的,它仅用于'Storyboard.SetTarget'。 我的方法最初同时处理控件的平面投影和不透明属性,但我想我会尽量使它与一个工作,以便我可以减少需要传递给它的参数的数量。那是当我注意到这个小怪癖。我一直在考虑再次使用旧的方法,但我认为知道这是否有任何解决方法会很有趣。 – DeVilFisCh

回答

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); 
} 
0

首先,难道你不能重新设计系统,使参数只是属性?做所有你需要做的财产第一,然后生成PropertyPath并将其分配给动画。

在那之前,你可以尝试比较`Path`属性: 如果(TargetProperty.Path ==新的PropertyPath(DependencyProperty的)。路径)

OK,貌似Path只会如果通过将字符串传入构造函数来创建PropertyPath,则匹配。

还有另一种方法将它们在WPF相比,但它是不可用在Silverlight:路径数据是在一个名为PathParameters数组,这将有其中创建的PropertyPath两个实例之间的匹配元件由相同的依赖特性传递给他们的构造函数。 Silverlight不允许你访问PathParameters,所以除非有另一个辅助方法(我看着PropertyPathConverter,但它看起来不会有帮助),唯一的选择(反射除外)是消除比较路径的需要。

+0

感谢您的建议。不幸的是,这似乎也不起作用。 至于重新设计的系统,原来的方法实际上同时处理投影和不透明属性,但我想我会让它只用一个(每个属性运行两次),因为它基本上是做大部分的反正同样的事情。我已经在考虑回收以前系统的一部分,以便不再需要比较路径,但正如我在我的帖子下写到的评论中所述,我认为知道是否有方法会很有趣围绕这第一个。 – DeVilFisCh

+0

@DeVilFisCh好吧,我想我已经到了它的底部,但它看起来像你还没有运气...看到我的编辑。 – nmclean

+0

幸运的是,KooKiz的回答指出了我的正确方向。我找到了解决我的问题的最简单的方法 - 使用'DependencyProperty'来代替。我可以对它进行比较,我也可以在'SetTargetProperty'上使用它。不过,谢谢你的建议。 – DeVilFisCh

0

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

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

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

然后你只需要直接与你的财产称之为:

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

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

+0

因为我需要动画不同的属性,我最初使用'PropertyPath'作为我的方法的参数,然后将其设置为'SetTargetProperty',但是由于您的回答,我发现我可以使用'DependencyProperty'来代替可以比较的并仍然被设置为“PropertyPath”。非常感谢! – DeVilFisCh