0

我们有一个控件,它使用许多不同大小和复杂性的控件来显示大量数据。由于需要布置大量控件,因此可能会出现非常明显的延迟。

我们知道延迟来自 Measure/Arrange 函数,因为我们有一个测试类,它源自一个堆栈面板,它用一些时序代码覆盖它们。

由于滚动条不断改变其范围的副作用,我们不想使用虚拟化,并且我们不想将数据隐藏在扩展器或任何其他折叠控件下,因为客户要求我们将其全部显示在一个长列表中。但是,他们想知道,当延迟发生时,控件实际上是在做某事,某种进度状态。

所以我的问题是 - 是否有某种方法可以创建一个控件,将加载动画显示为装饰器或其他东西,直到其内容实际布局?我很欣赏这可能是不可能的,因为安排/测量也是在 UI 线程上完成的。

4

1 回答 1

0

以我的经验,不幸的是,我不得不说答案是否定的。我花了很长时间试图找到一个非常相似的问题的解决方案。

问题的症结在于,任何使用数据填充 UI 控件的工作都必须在 UI 线程上执行。我的应用程序中的所有数据都是异步获取的,以“释放 UI”......虽然这发生在后台线程中,但 UI 线程可以自由显示动画加载图像。但是,一旦数据到达并开始填充 UI 控件,加载动画就会像您预期的那样冻结。

我什至尝试过使用 .gif 图像,因为我认为它不需要在 UI 线程上花费任何时间,但不幸的是,WPF 不支持 .gif 动画。我设计了一个类来依次为 .gif 文件的每一帧设置动画并再次尝试,但现在(手动).gif 动画确实使用了 UI 线程时间,因此在填充控件时冻结。

因此,您剩下的选项是:

  1. 显示动画加载图像/形状,当数据填充控件时将冻结或
  2. 显示非动画加载图像/形状

我选择了在填充数据时在最后一刻冻结的动画版本。

于 2013-08-15T12:25:31.450 回答