首页 > 解决方案 > 如何提高 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 有点复杂。我已经尽可能地简化了它们,但是你仍然可以注意到尝试绘制它们的延迟。

我想尽可能加快这种变化,但它开始看起来我可能只需要处理延迟本身而不是冻结。在变化的部分之间有一个加载指示会很好​​。就像一个 ActivityIndi​​cator。但我似乎无法找到如何在 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,以便我可以添加加载指示器?

标签: xamarinxamarin.forms

解决方案


我最终为每个部分制作了单独的集合视图。当您第一次切换到列表时,初始化列表会有延迟,但在部分之间切换已经变得即时了。


推荐阅读