2016-04-30 13 views
5

Viewport3D kullanarak bir 3D wpf uygulaması yazıyorum. Kullanıcı bir düğmeye basıldığında, AxisAngleRotation3D numaralı telefondan DoubleAnimation'u başlatmalıyım, ancak senkronize yapılmalıdır. Bu animasyon animation.Completed'da yapamıyorum çünkü bu animasyon bir sonraki ve bir sonraki sırayla çalıştırılıyor.WPF Senkronize animasyon ve UI iş parçacığı kilitlenmesi

ButtonHandler, UI iş parçacığı üzerinde çalışmalıdır, çünkü animasyonu hesaplamak için Viewport3D'yi kullanmıyorum.

Yani UI iş parçacığı senkronize animasyonunu başlatmalı ve sonra bitmiş çalışmayı bitirmeliyim.

Bu kodu çalıştı, ama kilitlenme neden:

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

bu kod tek bir yöntemde mi? –

+0

Evet. @ d.moncada – Mateusz

cevap

1

Tamam, bu sadece bir fikir. Neden bu animasyonları birkaç adımda oluşturmuyorsunuz? İlk önce animasyonun ilk grubunu başlatın ve ardından başka bir animasyon setini çalıştırmayı bitirdiklerinde. Bir çeşit zamanlayıcı ile senkronize edebilirsiniz.

Her adımda çalışacak animasyon ve nesne listesini oluşturabilir ve daha sonra bunları yalnızca çağırabilirsiniz.

+0

'Öncelikle her adımda çalışacak animasyon ve nesne listesi oluşturabilir ve sonra sadece onları çağırırsınız. Bu çok iyi bir fikir ve işe yarıyor. Teşekkürler. – Mateusz

İlgili konular