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();
là mã đó trong một phương pháp duy nhất? –
Có. @ d.moncada – Mateusz