2012-07-29 26 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