2016-04-30 3 views
5

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(); 
+0

ist dieser Code in einer einzigen Methode? –

+0

Ja. @ d.moncada – Mateusz

Antwort

1

Ok, es ist nur eine Idee. Warum erstellen Sie diese Animationen nicht in wenigen Schritten? Starten Sie zuerst den ersten Stapel der Animation und dann, wenn sie fertig sind, einen weiteren Satz von Animationen. Sie könnten es mit einer Art Timer synchronisieren.

Sie können zunächst eine Liste mit Animationen und Objekten erstellen, die in jedem Schritt ausgeführt werden sollen, und sie dann einfach aufrufen.

+0

'Sie können zunächst eine Liste von Animationen und Objekten erstellen, die in jedem Schritt ausgeführt werden sollen, und sie dann einfach aufrufen. Es ist eine sehr gute Idee und es funktioniert. Vielen Dank. – Mateusz