Медленная навигация из-за просмотра списка - PullRequest
0 голосов
/ 01 июня 2018

Я создаю приложение UWP, в котором я перехожу на страницу со списком.В конструкторе я вызываю асинхронную функцию для задания источника элементов списка.Данные хранятся локально, но для фильтрации и сортировки списка требуется некоторое время.Хотя я вызываю асинхронную функцию, навигация не происходит до тех пор, пока не будет установлен источник элементов для списка.

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 = …;
    });
}

Как это исправить, чтобы приложение сначала перемещалось, а затем фильтровало / сортировало / заполняло представление списка?

1 Ответ

0 голосов
/ 02 июня 2018

Вы добавляете дополнительную логику в конструктор вашего FriendsPage, что является дорогостоящим, поскольку задерживает визуальный рендеринг страницы, даже если такая операция "будет" выполняться неблокирующим образом.

Решение?Возьмите на себя ответственность за запуск этого кода для события, которое является встроенным в класс Page и которое выполняет навигацию по нему.Это событие OnNavigatedTo и вызывается, когда Frame заблокировал FriendsPage текущую страницу.

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

В той же статье вы можете проверить ситуации, когдавместо этого вы можете использовать событие Loaded.

Я бы также предложил не создавать асинхронный метод "забей и забудь", а вместо этого поменяй сигнатуру своей асинхронной операции, чтобы вместо этого вернуть ожидаемое o:

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

И ожидайте его выполнения на навигационном событии!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...