【问题标题】:Navigation slow because of listview由于列表视图,导航很慢
【发布时间】:2018-06-01 16:50:21
【问题描述】:

我正在制作一个 UWP 应用程序,我在其中导航到带有列表视图的页面。 在构造函数中,我调用了一个异步函数来设置listview的itemsource。数据存储在本地,但这需要一些时间来过滤和排序列表。虽然我调用了一个异步函数,但在设置列表视图的 itemsource 之前不会发生导航。

public FriendsPage()
{
    this.InitializeComponent();
    RefreshListViews();
}
//I tried both these versions: in the first one, 
//the app clearly takes one extra second to navigate to the page.
private async void RefreshListViews(){
    await Task.Delay(1000);
    Listview.ItemsSource = …;
}

private async void RefreshListViews(){
    await Dispatcher.RunAsyn(Windows.UI.Core.CoreDispatcherPriority.Normal,() => {
        Listview.ItemsSource = …;
    });
}

我该如何解决这个问题,让应用首先导航,然后过滤/排序/填充列表视图?

【问题讨论】:

  • 导航代码在哪里?
  • 问题在于导航到此页面时。就是这样:rootFrame.Navigate(typeof(FriendsPage));在我的主页中。

标签: c# listview uwp navigation


【解决方案1】:

您在 FriendsPage 的构造函数中添加了额外的逻辑,这很昂贵,因为它会延迟页面的视觉呈现,即使这样的操作“将”以非阻塞方式执行。

解决方案?将运行此代码的责任处理给Page 类中内置的事件,并处理对它的导航。该事件是OnNavigatedTo,当Frame 锁定FriendsPage 具有其当前页面时调用。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
      // Refresh List Views
}

在同一篇文章中,您可以检查您可能希望使用Loaded 事件的情况。

我还建议不要创建即发即弃的异步方法,而是将异步操作的签名更改为返回可等待的 o:

private async Task RefreshListViews()
{
   // Do stuff 
}

并且等待它在导航事件上的执行!

【讨论】:

  • 感谢您的提示,我之前确实尝试过使用所有可能的异步组合的 OnNavigatedTo,但没有成功。但是将此与 OnNavigatedTo 上的 frame.loaded += frame_loaded 和 OnNavigatedFrom 上的 frame.loaded -= frame_loaded 结合起来解决了我的问题。谢谢
猜你喜欢
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 2011-01-01
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多