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

单击其中一个部分按钮时,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,以便添加加载指示器?
发布于 2021-05-10 22:41:27
我最终为每个部分创建了单独的集合视图。当您第一次切换到列表时,初始化列表会有延迟,但在不同部分之间的切换是即时的。
https://stackoverflow.com/questions/65922602
复制相似问题