我们有一个控件,它使用许多大小和复杂性不同的控件来显示大量数据。由于需要部署大量的控制,可能会出现非常明显的延迟。
我们知道延迟来自Measure/Arrange函数,因为我们有一个测试类,它从堆栈面板派生,堆栈面板用一些定时代码覆盖了它们。
由于滚动条不断改变其范围的副作用,我们不想使用虚拟化,我们也不想将数据隐藏在扩展器或任何其他折叠控件下,因为客户要求我们将其全部显示在一个长列表中。然而,他们想知道,当延迟发生时,控制实际上在做一些事情,某种进展状态。
所以我的问题是——有没有一种方法可以创建一个控件,将加载的动画显示为装饰器或其他东西,直到其内容真正布局?我很感激这可能是不可能的,因为排列/测量也是在UI线程上完成的。
根据我的经验,不幸的是,答案是否定的。我花了很长时间试图找到一个非常相似的问题的解决方案。
问题的关键是,任何用数据填充UI控件的工作都必须在UI线程上执行。我的应用程序中的所有数据都是异步提取的,以"释放UI"。。。当这种情况发生在后台线程中时,UI线程可以自由地显示动画加载图像。但是,一旦数据到达并开始填充UI控件,加载动画就会冻结,正如您所期望的那样。
我甚至尝试过使用.gif图像,因为我认为它不需要在UI线程上花费任何时间,但不幸的是,WPF不支持.gif动画。我设计了一个类来依次为.gif文件的每一帧设置动画,并再次尝试,但现在(手动).gif动画确实使用了UI线程时间,因此在填充控件时冻结了。
所以你剩下的选项是:
- 显示动画加载图像/形状,当数据填充控件或
- 显示未设置动画的加载图像/形状
我选择了在数据填充的最后一刻冻结的动画版本。