我正在做一个同时使用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
事件,以便在图像准备好时获得回调。
你可能需要通过实验来找到最适合你的方案;这不是一门精确的科学。如果可能的话,最好在不同的设备上测试不同的性能。