首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何提高CollectionView性能

如何提高CollectionView性能
EN

Stack Overflow用户
提问于 2021-01-27 23:49:26
回答 1查看 83关注 0票数 1

我们有一个具有以下布局的登录页面:

单击其中一个部分按钮时,ViewModel中的ObservableCollection将被设置为另一个列表,如下所示:

代码语言:javascript
运行
复制
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线程上运行。我甚至尝试在更改部分后在后台线程上运行其余代码,以查看在继续该方法之前是否会这样做,但没有成功:

代码语言:javascript
运行
复制
 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,以便添加加载指示器?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-10 22:41:27

我最终为每个部分创建了单独的集合视图。当您第一次切换到列表时,初始化列表会有延迟,但在不同部分之间的切换是即时的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65922602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档