2016-04-30 35 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