2016-04-30 14 views
5

私はViewport3Dを使用して3D wpfアプリケーションを作成しています。ユーザーがボタンを押すとDoubleAnimationAxisAngleRotation3Dに開始する必要がありますが、これは同期して行う必要があります。このアニメーションは次のアニメーションと次のアニメーションを再帰的に実行するため、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

は、そのコードは1つの方法ですか? –

+0

はい。 @ d.moncada – Mateusz

答えて

1

[OK]を、それだけで考えです。なぜこのアニメーションをいくつかのステップで作成しないでください。最初にアニメーションの最初のバッチを開始し、その後別のアニメーションを終了します。何らかの種類のタイマーと同期させることができます。

各ステップで実行するアニメーションとオブジェクトのリストを作成してから、それらを呼び出すことができます。

+0

'まず、各ステップで実行するアニメーションとオブジェクトのリストを作成してから、それらを呼び出すことができます。非常に良いアイデアです。ありがとう。 – Mateusz

関連する問題