2010-02-09 26 views
4

我嘗試向我建立的用戶控件添加翻轉動畫。用戶控件很簡單,它有一個87x87的圖像正面和背面以及一些屬性。假設它代表我正在爲樂趣而工作的遊戲中的一塊拼圖。我正在嘗試爲用戶從卡組中挑選瓦片的翻轉效果進行動畫處理。我覺得我需要通過代碼而不是xaml來做到這一點,原因有兩個:1.瓦片翻轉之後還有另一個轉換來旋轉瓦片(當前正在工作)。2.瓦片翻轉後,我想解除事件。完全通過代碼執行翻轉動畫WPF

我得到的問題只是方法退出後最後一次動畫運行。 我想我需要一個故事板,但我看着糊塗了兩種方式的所有例子:

如何改變形象中期故事板,我設置targetProperty是 我一直在努力關閉這些是什麼做兩個博客。

http://www.codeguru.com/csharp/csharp/cs_misc/userinterface/article.php/c12221 http://blogs.msdn.com/tess/archive/2009/03/16/silverlight-wpf-flipimage-animation.aspx

public void FlipFront() 
    { 
      DoubleAnimation flipfront = new DoubleAnimation(0, 90, new Duration(new  TimeSpan(0, 0, 1))); 
     SkewTransform skew = new SkewTransform(); 
     this.RenderTransform = skew; 
     skew.BeginAnimation(SkewTransform.AngleYProperty, flipfront);   


    } 

    public void FlipBack() 
    { 

     ImageSourceConverter source = new ImageSourceConverter(); 
     this.ImageFace.Source = new BitmapImage(new Uri("Back.jpg", UriKind.Relative)); 

     DoubleAnimation flipfront = new DoubleAnimation(90, 0, new Duration(new TimeSpan(0, 0, 1))); 
     SkewTransform skew = new SkewTransform(); 
     this.RenderTransform = skew; 
     skew.BeginAnimation(SkewTransform.AngleYProperty, flipfront); 
    } 

    public void Flip() 
    { 
     FlipFront(); 
     FlipBack(); 
    } 

我打破了翻轉成兩個獨立的方法,因爲我雖然這將有助於解決我遇到的問題。

回答

1

哇,這並沒有在天長的時間更新...以防萬一任何人的追蹤這一個:

的問題是你不等待「翻轉前」動畫之前立即完成開始「翻轉」 - 現在,因爲您基本上是強制將Y角動畫立即跳到90度,這就是爲什麼它看起來不能正確觸發。

有很多方法可以解決這個問題 - 第一件讓人想到的事情是DoubleAnimation有一個方法叫做CreateClock,它會返回一個AnimationClock對象。該對象上有一個Completed事件,它會告訴你何時該動畫「完成」。附上一個處理程序(記住你要分離它,以免泄漏內存),並在那裏調用你的「開始翻轉」方法。我一起扔了一些效率很低的東西,但它會顯示原理:

public AnimationClock StartFlipFrontAnimation() 
{ 
    this.ImageFace.Source = _frontFace; 
    DoubleAnimation flipfront = new DoubleAnimation(0, 90, new Duration(new TimeSpan(0, 0, 3))); 
    SkewTransform skew = new SkewTransform(); 
    this.RenderTransform = skew; 
    skew.BeginAnimation(SkewTransform.AngleYProperty, flipfront); 
    return flipfront.CreateClock(); 
} 

public AnimationClock StartFlipBackAnimation() 
{ 
    this.ImageFace.Source = _backFace; 
    DoubleAnimation flipfront = new DoubleAnimation(90, 0, new Duration(new TimeSpan(0, 0, 3))); 
    SkewTransform skew = new SkewTransform(); 
    this.RenderTransform = skew; 
    skew.BeginAnimation(SkewTransform.AngleYProperty, flipfront); 
    return flipfront.CreateClock(); 
} 

public void BeginFlip() 
{  
    var frontClk = StartFlipFrontAnimation();  
    frontClk.Completed += FrontFlipDone;   
} 

private void FrontFlipDone(object sender, EventArgs args) 
{ 
    var clk = sender as AnimationClock; 
    if(clk != null) 
    { 
     clk.Completed -= FrontFlipDone; 
    } 
    var backClk = StartFlipBackAnimation(); 
}