【发布时间】:2011-11-03 09:00:36
【问题描述】:
如何强制动画等待其整个渲染才能继续使用我的代码?
我有一个简单的动画,在相当重的网格上显示加载面板,我想这需要一些时间才能使面板呈现淡入效果,在显示动画之前引发不幸完成的事件并且代码继续运行并启动一个空闲几秒钟(正确)应用程序的数据进程。这应该在面板有效地呈现在屏幕上之后开始!
【问题讨论】:
如何强制动画等待其整个渲染才能继续使用我的代码?
我有一个简单的动画,在相当重的网格上显示加载面板,我想这需要一些时间才能使面板呈现淡入效果,在显示动画之前引发不幸完成的事件并且代码继续运行并启动一个空闲几秒钟(正确)应用程序的数据进程。这应该在面板有效地呈现在屏幕上之后开始!
【问题讨论】:
这个动画是用LayoutTransform 或RenderTransform 完成的吗?
如果LayoutTransform那么我认为在动画完成事件中处理相关视觉的LayoutUpdated事件。因此,当视觉真正第一次响应布局传递之后动画完成时,这将是您的代码开始新进程的正确位置。在流程开始后,取消挂钩同一视觉对象的 layoutupdated 事件。
可悲的是RenderTransform 除了CompositionTarget.Rendering 之外没有这样的事件。您可以尝试在动画完成事件中显式处理此事件。此外,在动画完成后处理渲染事件时,请启动您的进程并取消挂钩渲染事件。如果未挂钩,此事件可能会使您的应用程序变慢。
如果您需要更多帮助,请告诉我。
【讨论】:
您可以调用一个空的低优先级操作:
Dispatcher.CurrentDispatcher.Invoke(() => { }, DispatcherPriority.Background);
这会阻止代码执行,直到所有优先级高于DispatcherPriority.Background 的操作都得到处理。所以你可以确保你的动画代码在其他一些阻塞代码以更高优先级执行之前已经被处理(并且动画逻辑保留在调度程序队列中)。
【讨论】: