更新整个问题,使之更加具体
我有一个WPF应用程序,当加载时,它显示一个循环加载指示符,而另一个线程正在从服务器获取数据并操作数据。
这个WPF应用程序有一个ItemsControl,它有大约500个条目,有超过10个不同的模板。我有一个模板选择器,可以根据项目的属性确定要使用的模板。
我有一个复选框,用于显示和隐藏UI中每个项中的某些文本块。当我选中复选框时,UI将冻结10秒,然后开始使用文本块再次响应。如果我取消选中复选框,它将冻结约7秒,然后文本块将消失。
我知道我应该使用虚拟化,但它并不适用于我,因为每个项目都没有相同的高度。我试过“标准”VirtualizationMode,它只是缓慢的滚动下来,不能使用我,和“回收”将无法工作,因为项目没有相同的高度。
而不是让UI冻结7-10秒,我想显示一个加载指示符。我不是在问如何在加载应用程序时显示加载指示符,而是在UI忙于重新绘制时如何显示加载指示符。
请指教,谢谢!
发布于 2018-01-03 09:39:13
IIRC有一些,但请考虑一下--当UI将要呈现时,绘图区域是脏的,可以随时更新。更新即将发生。如果更新需要很长时间(比如说,3秒),那么即使您的连体/viewmodel/etc对“我开始呈现”事件有反应,您想要实际做什么呢?
显示忙指示器?显示?这是个变化。它会标记相关区域脏,但是一些东西已经脏了,重画还在等待,而且需要很长时间(3s),对吗?因此,如果您显示/隐藏任何内容,它将在呈现完成后显示。也就是说,你的忙碌指示器可能会出现在3s之后,并会立即隐藏。
当然,这与其他事情无关。当呈现开始时,您可以发送TCP数据包、播放声音、显示另一个窗口/表面以及它自己的独立的三个(这样它们就不会等到第一次呈现完成)等等。
我认为你真正需要做的是:
usercontrol>grid>scroll>listbox>panel>[items:usercontrol>grid>listbox>panel>[items:grid>textblock]的布局更改为usercontrol>grid>listbox>scrollpanel>[items:textblock]]
以此类推,这是初学者的基础。除了一些基本点外,WPF的优化实际上可能是很困难的。我从以前的经验中了解到的大多数文章,都帮助我成功地优化了许多应用程序:
现在,回答你的问题,尽管我仍然认为这不是正确的方法:
https://stackoverflow.com/questions/48073515
复制相似问题