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();
to ten kod w pojedynczej metodzie? –
Tak. @ d.moncada – Mateusz