我正在使用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();
是單一方法中的代碼? –
是的。 @ d.moncada – Mateusz