2016-04-30 71 views
5

我正在使用Viewport3D編寫一個3D wpf應用程序。當用戶按下按鈕時,我必須在AxisAngleRotation3D上啓動DoubleAnimation,但它必須同步完成。我無法在animation.Completed上執行此操作,因爲此動畫以遞歸方式運行下一個和下一個。WPF同步動畫和UI線程死鎖

ButtonHandler必須在UI線程上工作,因爲要計算動畫我幾乎不使用Viewport3D。

所以我必須在UI線程中啓動同步動畫,並在完成後繼續工作。

我試過這個代碼,但它導致死鎖:

AxisAngleRotation3D axis; 
DoubleAnimation animation; 
DependencyProperty dp; 

var worker = new Thread(() => 
{ 
     Dispatcher.CurrentDispatcher.InvokeShutdown(); 
     Dispatcher.Run(); 
}); 

worker.SetApartmentState(ApartmentState.STA); 
worker.Start(); 

AutoResetEvent animationDone = new AutoResetEvent(false); 
EventHandler handler = null; 
handler = (sender, args) => 
{ 
    animation.Completed -= handler; // remove self 
    animationDone.Set(); // signal completion 
}; 

animation.Completed += handler; 

Dispatcher.CurrentDispatcher.Invoke(new Action(() => 
{ 
     axis.BeginAnimation(dp, animation); 
})); 

animationDone.WaitOne(); 
+0

是單一方法中的代碼? –

+0

是的。 @ d.moncada – Mateusz

回答

1

好吧,這只是一個想法。你爲什麼不在幾個步驟中創建這個動畫。首先開始第一批動畫,然後當他們完成時再運行另一組動畫。你可以用某種計時器同步它。

您可以先創建動畫和對象列表,以便在每個步驟中運行,然後調用它們。

+0

'您可以先創建動畫和對象的列表,以便在每一步中運行,然後調用它們。「這是一個非常好的主意,它很有用。謝謝。 – Mateusz