如何检测当一个ListView或任何控件完成渲染?



我正在做一个同时使用UWP和WASM的Uno项目。该项目包含一个ListView或GridView,其源是一个ObservableCollection。因为它从API获取数据。我正在显示一个进度指示器,我发现进度指示器一直保持活动状态,直到ObservableCollection被数据项填充。

问题是在ObservableCollection拥有数据和控件完成呈现视图之间存在延迟。在这种情况下,它是一个ObservableCollection的图像和GridView或ListView不填充。

我还不能确定一个事件,它将告诉我何时停用进度指示器。

WinUI API中没有定义事件来告诉您UI何时完成呈现,因此您必须自己创建事件。这可能是值得的,当你有一个复杂、沉重的UI,可见延迟渲染之后获得的数据。

有几种可能的策略:

  • 在设定延时后隐藏进度指示器。
  • 通过CoreDispatcher.RunIdleAsync()调度回调。这应该只在UI线程不"忙"时触发,这是它完成渲染的粗略代理。例如:Dispatcher.RunIdleAsync(_ => progressRing.IsActive = false);
  • 特定于ListView/ItemsControl:您可以使用ContainerFromIndex()方法检查列表是否实际具有项目视图,例如listView.ContainerFromIndex(expectedIndex) != null。要小心,因为列表只会为实际在视图中的项目创建容器。
  • 特定Image:图片来自远程url异步加载。您可以订阅ImageOpened事件,以便在图像准备好时获得回调。

你可能需要通过实验来找到最适合你的方案;这不是一门精确的科学。如果可能的话,最好在不同的设备上测试不同的性能。

相关内容

  • 没有找到相关文章

最新更新