私はViewport3Dを使用して3D wpfアプリケーションを作成しています。ユーザーがボタンを押すとDoubleAnimation
をAxisAngleRotation3D
に開始する必要がありますが、これは同期して行う必要があります。このアニメーションは次のアニメーションと次のアニメーションを再帰的に実行するため、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();
は、そのコードは1つの方法ですか? –
はい。 @ d.moncada – Mateusz