2016-04-30 17 views
5

Tôi đang viết một ứng dụng wpf 3D bằng cách sử dụng Viewport3D. Khi người dùng nhấn nút, tôi phải bắt đầu DoubleAnimation trên AxisAngleRotation3D, nhưng phải được thực hiện đồng bộ. Tôi không thể làm điều đó trên animation.Completed, bởi vì hoạt ảnh này chạy tiếp theo và đệ quy tiếp theo.WPF Hình động đồng bộ và chuỗi khóa giao diện người dùng

NútHandler phải hoạt động trên chuỗi giao diện người dùng, vì để tính toán hoạt ảnh, tôi hầu như không sử dụng Viewport3D.

Vì vậy, tôi phải trong chuỗi giao diện người dùng bắt đầu hoạt ảnh đồng bộ và sau khi hoàn thành công việc liên tục.

Tôi đã thử mã này, nhưng nó gây ra bế tắc:

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

là mã đó trong một phương pháp duy nhất? –

+0

Có. @ d.moncada – Mateusz

Trả lời

1

Ok, nó chỉ là một ý tưởng. Tại sao bạn không tạo hoạt ảnh này trong vài bước. Trước tiên, bắt đầu loạt hoạt ảnh đầu tiên và sau đó, khi họ kết thúc, hãy chạy một bộ hoạt ảnh khác. Bạn có thể đồng bộ hóa nó với một số loại bộ đếm thời gian.

Trước tiên, bạn có thể tạo danh sách hoạt ảnh và đối tượng để chạy trong mỗi bước và sau đó chỉ cần gọi chúng.

+0

'Trước tiên, bạn có thể tạo danh sách hoạt ảnh và đối tượng để chạy trong mỗi bước và sau đó chỉ cần gọi chúng.' Đó là ý tưởng rất hay và nó hoạt động. Cảm ơn. – Mateusz

Các vấn đề liên quan