2016-04-30 54 views
5

Piszę aplikację 3D wpf przy użyciu Viewport3D. Kiedy użytkownik naciska przycisk, muszę uruchomić DoubleAnimation na , ale musi to być wykonane synchronicznie. Nie mogę tego zrobić na animation.Completed, ponieważ ta animacja uruchamia następny i następny rekursywnie.WPF Synchroniczna animacja i zakleszczenie gwintu interfejsu użytkownika

ButtonHandler musi działać na wątku UI, ponieważ do obliczenia animacji rzadko używam Viewport3D.

Więc muszę w synchronizacji wątku UI rozpocząć start i po zakończeniu pracy kontynualnej.

Próbowałem ten kod, ale to spowodować zakleszczenie:

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

to ten kod w pojedynczej metodzie? –

+0

Tak. @ d.moncada – Mateusz

Odpowiedz

1

Ok, to tylko pomysł. Dlaczego nie stworzysz animacji w kilku krokach? Najpierw uruchom pierwszą serię animacji, a następnie, gdy skończą, uruchom kolejny zestaw animacji. Możesz zsynchronizować go z jakimś timerem.

Możesz najpierw utworzyć listę animacji i obiektów do uruchomienia w każdym kroku, a następnie po prostu wywołać je.

+0

'Możesz najpierw utworzyć listę animacji i obiektów do uruchomienia w każdym kroku, a następnie po prostu je wywołać." To bardzo dobry pomysł i działa. Dzięki. – Mateusz