xamarin - 如何提高 CollectionView 的性能
问题描述
我们有一个具有以下布局的登录页面:
当您单击其中一个部分按钮时,ViewModel 中的 ObservableCollection 将设置为另一个列表,如下所示:
private async void processtableOfContentsListView_ItemTapped(object sender, ItemTappedEventArgs e)
{
var tocItem = e?.Item as TableOfContentsItem;
if (viewModel.SelectedTableOfContentsItem == tocItem)
{
return;
}
viewModel.CurrentSectionItems = tocItem.SectionItems;
viewModel.SelectedTableOfContentsItem = tocItem;
}
随着其他操作的进行,这被简化了。
我的问题是 CollectionView 更改部分花费的时间太长。尝试加载新项目时有明显的延迟。公平地说,项目的 DataTemplate 有点复杂。我已经尽可能地简化了它们,但是你仍然可以注意到尝试绘制它们的延迟。
我想尽可能加快这种变化,但它开始看起来我可能只需要处理延迟本身而不是冻结。在变化的部分之间有一个加载指示会很好。就像一个 ActivityIndicator。但我似乎无法找到如何在 EventHandler 的开头为按钮进行 UI 更改。即使我在事件处理程序的开头清除了 ObservableCollection,它仍然会等到方法完成后再显示任何 UI 更改。
我已经检查过了,事件处理程序正在主 UI 线程上运行。我什至尝试在更改部分后在后台线程上运行其余代码,以查看它是否会在继续该方法之前,但没有运气:
private async void processtableOfContentsListView_ItemTapped(object sender, ItemTappedEventArgs e)
{
if (MainThread.IsMainThread) //is true
{
}
var tocItem = e?.Item as TableOfContentsItem;
await Task.Run(async () =>
{
await MainThread.InvokeOnMainThreadAsync(() => {
viewModel.SelectedTableOfContentsItem = tocItem;
viewModel.CurrentSectionItems = tocItem.SectionItems;
});
});
Task.Run(() => DoWork(sender, e));
}
我的问题是两部分的。
有谁知道如何加快 CollectionView 的重绘速度?
如果没有,我如何设置 UI 更改以在事件处理程序的开头清除 CollectionView,以便我可以添加加载指示器?
解决方案
我最终为每个部分制作了单独的集合视图。当您第一次切换到列表时,初始化列表会有延迟,但在部分之间切换已经变得即时了。
推荐阅读
- java - Spring-Boot WebFlux getFormData fails to parse real x-www-form-urlencoded data?
- node.js - 使用 socks5 时的 Request-Promise 库错误:- RequestError:错误:getaddrinfo ENOTFOUND
- c++ - C2011 'class' 类型重新定义
- events - wxpython 4.01 / Python 3.7 中事件函数的值
- python - 当 \d 什么都不返回时,如何告诉 re 返回所有数字?
- python - __str__ 的多种输出格式
- asp.net - 如何将更改保存到数据库中
- python - Filling in null values in one column based on aggregate of a different column
- php - 如果我有带时区的时间戳,如何获取时间戳是否早于一天?
- algorithm - 优化 Haskell 中无限字符串的过滤