Prism 7 UWP Навигация Назад Параметры отсутствуют - PullRequest
0 голосов
/ 07 марта 2019

С учетом приложения UWP Prism 7 с тремя представлениями и соответствующими моделями представления:

containerRegistry.RegisterForNavigation<BlankPage1, BlankPage1ViewModel>();
containerRegistry.RegisterForNavigation<BlankPage2, BlankPage2ViewModel>();
containerRegistry.RegisterForNavigation<BlankPage3, BlankPage3ViewModel>();

Если мы перейдем от BlankPage1 к BlankPage2, передав параметр (из команды в ViewModel1):

public virtual DelegateCommand GoToPage2Command => new DelegateCommand(GoToPage2);
public virtual async void GoToPage2() {
     await NavigationService.NavigateAsync("BlankPage2", null, ("param", 5678));
}

При OnNavigatedToAsync переопределении BlankPage2ViewModel параметр правильно передается.

Теперь, если мы перейдем от BlankPage2ViewModel к BlankPage3ViewModel, с помощью команды и передадим другой параметр

public virtual DelegateCommand GoToPage3Command => new DelegateCommand(GoToPage3);
public virtual async void GoToPage3() {
    await NavigationService.NavigateAsync("BlankPage3", null, ("param", 1234));
}

Опять же, это работает, и значение параметра 1234 передается в BlankPage3ViewModel.

Теперь, однако, если мы вернемся к BlankPage2ViewModel:

await NavigationService.GoBackAsync();

Параметры не передаются обратно в OnNavigatedToAsync переопределение BlankPage2ViewModel. Конечно, мы ожидаем увидеть значение параметра 5678?

ПРИМЕЧАНИЕ : мы также устанавливаем NavigationCacheMode в Required внутри каждого вида.

Ответ на вопрос , заданный на форумах MSDN относительно аналогичной проблемы:

Если вы используете Frame.Navigate для перехода на ту же страницу, ваш PageA не будет повторно реализован, но будет вызываться метод OnNavigatedTo с новыми параметрами.

Таким образом, вы можете изменить информацию, отображаемую на странице (даже воспроизвести какой-либо переход при необходимости); и в качестве дополнительного бонуса история кадров сохраняет прежние параметры PageA, что позволяет вам вызывать Frame.GoBack для возврата к предыдущему состоянию PageA .

Это по замыслу в Prism, что никакие параметры не передаются обратно или потенциальная ошибка?

1 Ответ

1 голос
/ 11 марта 2019

Как сказал @Bite, в общем проекте UWP нет проблем.Когда вы вызываете метод Frame.Navigate(typeof(page), "params"); для перехода между различными страницами и вызываете метод Frame.GoBack() для возврата на предыдущую страницу, параметры все равно остаются там.

Поскольку вы используете навигационную службу Prism,там должно быть несколько разных мест.Если вы хотите узнать подробную причину, вам нужно отладить исходный код Prism , чтобы узнать о принципе его службы навигации.

Здесь я также заинтересован в его службе навигации, поэтому я потратил некоторое время на изучение его исходного кода.Ядро навигационных сервисов должно быть в NavigationService.cs и FrameFacade.cs .

. Вы можете увидеть, что он, наконец, вызовет _frame.Navigate.() метод для перехода с одной страницы на другую.

var parameter = pageNavInfo.QueryString;
return _frame.Navigate(
                  sourcePageType: pageNavInfo.View,
                  parameter: parameter,
                  infoOverride: infoOverride);

Объект _frame на самом деле является общим встроенным типом UWP Frame Class .Итак, в общем, параметры навигации должны быть там, когда вы вызываете _frame.GoBack () , чтобы вернуться на предыдущую страницу.

Но, если вы добавите несколько точек останова для его отладки,вы увидите, что значение параметра всегда равно null в приведенном выше _frame.Navigate(sourcePageType: pageNavInfo.View,parameter:parameter,infoOverride: infoOverride); кодовом блоке.Вот почему вы всегда не можете получить параметр навигации при вызове метода GoBack().Это потому, что он всегда передает null в качестве параметра методу _frame.Navigate.Он реализовал свои NavigationParameters .Все параметры, которые вы передали методу _navigationService.NavigateAsync(), должны быть в параметрах _external.

enter image description here

Итак, я уже объяснил вам причину,Я не могу сказать, что это дизайн или потенциальная проблема.Возможно, они не принимают во внимание исторические параметры навигации при вызове метода 'GoBack ()'. Вы можете отправить свой вопрос в выпуск Github , чтобы узнать, есть ли обходные пути от официального.Или, если вы заинтересованы в этом, вы можете попытаться изменить его исходный код и скомпилировать свою собственную версию.

...