将整个问题更新为更具体
我有一个WPF应用程序,在加载时,它显示一个循环加载指示器,而另一个线程从服务器获取数据并操纵数据。
这个WPF应用程序有一个ItemsControl,其中包含约500个项目,包含10个以上的不同模板。我有一个模板选择器,用于根据项目的属性确定要使用的模板。
我有一个复选框,用于显示和隐藏UI中每个项目中的某些文本块。当我选中该复选框时,UI将冻结10秒钟,然后再次使用文本块开始响应。如果我取消选中该复选框,它将冻结约7秒钟,然后文本块将消失。
我知道我应该使用虚拟化,但它对我不起作用,因为每个项目的高度都不相同。我已经尝试过"标准" VirtualizationMode,向下滚动时速度很慢,对我来说不可用,以及"回收"由于物品的高度不同,所以不会工作。
我希望显示加载指示器,而不是将UI冻结7-10秒。我不是在问加载应用程序时如何显示加载指示器,而是在UI忙于重新绘制时如何显示加载指示器。
请指教,谢谢!
答案 0 :(得分:1)
显示忙碌指示器? 显示强>?那是一个变化。它会将相关区域标记为脏,但是某些内容已经很脏,重绘正在等待,并且需要很长时间(3s),对吧?因此,如果您显示/隐藏任何内容,它将在渲染完成后显示 。也就是说,您的忙碌指示器可能会在3秒后出现并立即隐藏。
当然,这与其他事情无关......当渲染开始时,你可以发送一个TCP数据包,播放声音,用自己独立的threds显示另一个窗口/表面(所以他们不会等到第一次渲染结束)等等。
我认为你真正需要做的是混合:
usercontrol>grid>scroll>listbox>panel>[items:usercontrol>grid>listbox>panel>[items:grid>textblock]
的布局更改为usercontrol>grid>listbox>scrollpanel>[items:textblock]]
现在,回答你的问题,虽然我仍然认为这不是正确的方法:
event CompositionTarget.Render
MSDN DispatcherPriority.ContextIdle
MSDN的任务; source article