0

给定一个具有三个视图和相应视图模型的 Prism 7 UWP 应用程序:

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现在,如果我们从to导航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

注意:我们还设置NavigationCacheModeRequired每个视图内部。

对 MSDN 论坛上关于类似问题的问题的回答指出:

如果您使用 Frame.Navigate 导航到同一页面,则不会重新实例化您的 PageA,但将使用新参数调用 OnNavigatedTo 方法。

这样,您可以更改页面上显示的信息(如果需要,甚至可以播放一些过渡);作为额外的奖励,Frame 历史记录确实保留了您以前的 PageA 参数,允许您调用 Frame.GoBack 以返回到以前的 PageA状态。

这是 Prism 设计的,没有参数被传回还是潜在的错误?

4

1 回答 1

1

正如@Bite 所说,一般的UWP 项目没有问题。当您调用Frame.Navigate(typeof(page), "params");方法在不同页面之间导航并调用Frame.GoBack()方法返回上一页时,参数将仍然存在。

由于您使用的是 Prism 的导航服务,因此其中应该有一些不同的地方。想知道详细原因,需要调试它的Prism源码来了解它的导航服务原理。

在这里,我对它的导航服务也很感兴趣,所以我花了一些时间研究它的源代码。导航服务的核心应该在NavigationService.csFrameFacade.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()这就是为什么在调用方法时总是无法获取导航参数的原因。这是因为它总是将nullas 参数传递给_frame.Navigate方法。它已经实现了自己的NavigationParameters。您传递给_navigationService.NavigateAsync()方法的所有参数都应该在“_external”参数中。

在此处输入图像描述

所以,我已经告诉你原因了。我不能说这是设计使然或潜在问题。也许,他们在调用'GoBack()'方法时没有考虑历史导航参数。你可以将你的问题提交到Github issue,看看官方是否有解决方法。或者,如果您对它感兴趣,您可以尝试更改其源代码并为您编译您自己的自定义版本。

于 2019-03-11T06:29:53.370 回答