2012-05-30 31 views
0

我有一個包含圖像的按鈕,我希望該圖像在執行代碼時旋轉,然後在此處理結束時停止。如果在處理後調用Stop(),WPF StoryBoard不會開始

我的代碼幾乎可以工作,如果我開始故事板,但當我添加行sb.Stop(),動畫永遠不會開始。

這裏是我的代碼:

private void refreshPostIt(int postItIndex) 
    { 
     Button btn = // Button to rotate 

     Storyboard sb = new Storyboard(); 
     DoubleAnimation rotate = new DoubleAnimation(); 
     rotate.From = 0; 
     rotate.To = 360; 
     rotate.RepeatBehavior = RepeatBehavior.Forever; 

     RotateTransform rt = new RotateTransform(); 
     btn.RenderTransformOrigin = new Point(0.5, 0.5); 
     btn.RenderTransform = rt; 
     Storyboard.SetTarget(rotate, btn); 
     Storyboard.SetTargetName(rotate, btn.Name); 
     Storyboard.SetTargetProperty(rotate, new PropertyPath("(UIElement.RenderTransform).(RotateTransform.Angle)")); 
     sb.Children.Add(rotate); 
     sb.Begin(this, true); 

     // Some code which can take several seconds 

     sb.Stop(); 
    } 

我卡住了。

+0

你的「一些代碼」在一個單獨的線程?或者不管怎樣都不會阻止執行下面的代碼? – peer

+0

不,這是同一個線程,同步。 –

+0

呼叫存在和停止之間需要多少時間?也許,動畫運行速度太快。 –

回答

0

我有一個適用於我的解決方案。

private void refreshPostIt() 
    { 
     // Button btn; is defined somewhere else 

     Storyboard sb = new Storyboard(); 
     DoubleAnimation rotate = new DoubleAnimation(); 
     rotate.From = 0; 
     rotate.To = 360; 
     rotate.RepeatBehavior = RepeatBehavior.Forever; 

     RotateTransform rt = new RotateTransform(); 
     btn.RenderTransformOrigin = new Point(0.5, 0.5); 
     btn.RenderTransform = rt; 
     Storyboard.SetTarget(rotate, btn); 
     Storyboard.SetTargetName(rotate, btn.Name); 
     Storyboard.SetTargetProperty(rotate, new PropertyPath("(UIElement.RenderTransform).(RotateTransform.Angle)")); 
     sb.Children.Add(rotate); 
     sb.Begin(btn, true); 

      // Do your stuff here (Not in the UI Thread) 
      // Maybe use a semaphore to lock the sb.Stop(btn) 

     sb.Stop(btn); 
    } 

整個示例代碼:

public partial class Window1 : Window 
{ 
    Button btn; 
    Storyboard sb; 
    public Window1() 
    { 
     btn = new Button(); 
     InitializeComponent(); 
     this.grid.Children.Add(btn); 
     refreshPostIt(); 
    } 

    private void refreshPostIt() 
    { 
     // Button btn; is defined somewhere else 

     sb = new Storyboard(); 
     DoubleAnimation rotate = new DoubleAnimation(); 
     rotate.From = 0; 
     rotate.To = 360; 
     rotate.RepeatBehavior = RepeatBehavior.Forever; 

     RotateTransform rt = new RotateTransform(); 
     btn.RenderTransformOrigin = new Point(0.5, 0.5); 
     btn.RenderTransform = rt; 
     Storyboard.SetTarget(rotate, btn); 
     Storyboard.SetTargetName(rotate, btn.Name); 
     Storyboard.SetTargetProperty(rotate, new PropertyPath("(UIElement.RenderTransform).(RotateTransform.Angle)")); 
     sb.Children.Add(rotate); 
     sb.Begin(btn, true); 

     BackgroundWorker asd = new BackgroundWorker(); 
     asd.DoWork += new DoWorkEventHandler(asd_DoWork); 
     asd.RunWorkerCompleted += new RunWorkerCompletedEventHandler(asd_RunWorkerCompleted); 
     asd.RunWorkerAsync(); 

    } 

    void asd_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     if (sb != null) 
     { 
      sb.Stop(btn); 
     } 
    } 

    void asd_DoWork(object sender, DoWorkEventArgs e) 
    { 
     Thread.Sleep(2000); 
    } 
} 

好吧,我想解釋什麼,我認爲是你的問題就在這裏。當你使用UI-Thread來完成你的「工作」時,它不能更新你的UI,雖然不會動畫旋轉,當它完成你的「工作」時,在開始和停止動畫之間,最後會有時間要更新用戶界面,請致電停止動畫。這導致不顯示任何動畫。您需要將工作放在不同的線程中以防止發生這種情況。

希望有所幫助。

+0

謝謝同行,這個作品!我想過線程問題,但沒有一個可行的解決方案。你的確如此。我發現BackgroundWorker感謝你:) –

相關問題