2016-04-30 7 views
5

Я пишу приложение 3D wpf с помощью Viewport3D. Когда пользователь нажимает кнопку, я должен начать DoubleAnimation по телефону AxisAngleRotation3D, но это должно быть сделано синхронно. Я не могу сделать это на animation.Completed, потому что эта анимация запускает следующий и следующий рекурсивно.WPF Синхронная анимация и тупик пользовательского интерфейса

ButtonHandler должен работать с потоком пользовательского интерфейса, потому что для вычисления анимации я вряд ли использую 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

Смежные вопросы