微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何提高 CollectionView 性能

如何解决我如何提高 CollectionView 性能

我们有一个具有这种布局的着陆页:

layout

当您单击某个部分按钮时,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,以便我可以添加加载指示器?

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。