2012-07-29 61 views
1

我有以下方法可行。我想把它放在一个返回故事板的实用程序方法中。我将这个转换成Storyboard所做的每一次尝试都失败了,我花了很多时间研究。除非有人来拯救我,我已经准备好放弃了。将C#动画代码转换为故事板

这是我要转换的代码:

public override void Begin(FrameworkElement element, int duration) 
{ 
    var transform = new ScaleTransform(); 
    element.LayoutTransform = transform; 

    var animation = new DoubleAnimation 
         { 
          From = 1, 
          To = 0, 
          Duration = TimeSpan.FromMilliseconds(duration), 
          FillBehavior = FillBehavior.Stop, 
          EasingFunction = new QuinticEase { EasingMode = EasingMode.EaseIn } 
         }; 

    transform.BeginAnimation(ScaleTransform.ScaleXProperty, animation); 
    transform.BeginAnimation(ScaleTransform.ScaleYProperty, animation); 
} 

因此,而不是两个BeginAnimation()调用,我想回到一个故事板,因此所有我需要做的就是调用storyboard.Begin()。我知道这不应该那么难,但我只是没有得到它。

谢谢。

编辑:针对HB的建议,我想下面的代码,它仍然不能正常工作:

private static Storyboard CreateAnimationStoryboard(FrameworkElement element, int duration) 
{ 
    var sb = new Storyboard(); 
    var scale = new ScaleTransform(1, 1); 
    element.RenderTransform = scale; 
    element.RegisterName("scale", scale); 

    var animation = new DoubleAnimation 
    { 
     From = 1, 
     To = 0, 
     Duration = TimeSpan.FromMilliseconds(duration), 
     FillBehavior = FillBehavior.Stop, 
     EasingFunction = new QuinticEase { EasingMode = EasingMode.EaseIn } 
    }; 
    sb.Children.Add(animation); 

    Storyboard.SetTarget(animation, scale); 
    Storyboard.SetTargetProperty(animation, new PropertyPath(ScaleTransform.ScaleXProperty)); 

    return sb; 
} 

我知道我只是动画X轴 - 只是想要得到的东西先工作。

回答

0

您需要两个动画,然后将附加的Storyboard属性设置为使用SetTargetPropertySetTargetName为正确对象上的正确属性设置动画。

到故事板是如何工作的,你还需要设置一个名称范围(NameScope.SetNameScope)由于,登记的转换的名称,并调用StoryBoard.Begincontaining element overload

例如

NameScope.SetNameScope(element, new NameScope()); 

var transform = new ScaleTransform(); 
var transformName = "transform"; 
element.RegisterName(transformName, transform); 
element.RenderTransform = transform; 

var xAnimation = new DoubleAnimation(2, TimeSpan.FromSeconds(1)); 
var yAnimation = xAnimation.Clone(); 

var storyboard = new Storyboard() 
{ 
    Children = { xAnimation, yAnimation } 
}; 

Storyboard.SetTargetProperty(xAnimation, new PropertyPath("(ScaleTransform.ScaleX)")); 
Storyboard.SetTargetProperty(yAnimation, new PropertyPath("(ScaleTransform.ScaleY)")); 

Storyboard.SetTargetName(xAnimation, transformName); 
Storyboard.SetTargetName(yAnimation, transformName); 

storyboard.Begin(element); 
+0

是的,我得到了那么多。也许你提到的复杂问题的细节可能会有帮助? – 2012-07-29 18:52:33

+0

@DanThomas:[This](http://stackoverflow.com/a/4567058/546730)听起来像是这个问题。 – 2012-07-29 18:59:50

+0

谢谢,但那个特别的问题是如果你正在代码中创建一个框架元素,我不这样做。框架元素已经通过xaml存在,我通过附加的行为调用这个方法。任何其他想法? :) – 2012-07-29 19:12:19

0

我建议使用Expression Blend,并开始录制从那里,它应该在创建XAML的故事板。而不是用C#编写硬编码,并试图将其逐个翻译成故事板,因此可能是一个容易出错的错误。

+0

谢谢,但我需要在代码中做到这一点,我创建了一个行为,我附加到一个元素并绑定到一个ViewModel属性,该属性允许ViewModel触发一个动画可见性转换,并在ViewModel完成时调用回调函数。我认为仍然可以在xaml中创建动画,但因为当他们完成时我需要回调,所有代码都更容易完成。 – 2012-07-30 03:02:23