Ich schreibe eine 3D-WPF-Anwendung mit Viewport3D. Wenn der Benutzer eine Taste drückt, muss ich DoubleAnimation
auf AxisAngleRotation3D
starten, aber es muss synchron erfolgen. Ich kann es nicht auf animation.Completed
, weil diese Animation die nächste und die nächste rekursiv ausführen.WPF synchrone Animation und UI Thread Deadlock
ButtonHandler muss auf dem UI-Thread arbeiten, da ich zur Berechnung der Animation Viewport3D kaum verwende.
Also muss ich im UI-Thread synchrone Animation starten und nach Abschluss der Arbeit fortfahren.
habe ich versucht, diesen Code, aber es verursacht Deadlock:
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();
ist dieser Code in einer einzigen Methode? –
Ja. @ d.moncada – Mateusz