为什么绝对导航URL不能清除导航堆栈?

时间:2019-07-16 22:16:50

标签: xamarin.forms prism

尽管我正在调查一个问题,即使导航到另一页面后,该问题仍使我的应用程序仍停留在初始屏幕上,但我发现有些东西对我来说很奇怪。

我设法在一个小型简单项目中重现了该问题。 基本上,我的Prism项目中有3个页面和ViewModels:SplashPage(ContentPage),MainPage(ContentPage),RootPage(MasterDetailPage)。

它们都已注册导航以及NavigationPage。

这是我App.xaml.cs中的内容:

protected override async void OnInitialized()
{
     InitializeComponent();
     await NavigationService.NavigateAsync("/SplashPage");
}

并在SplashPageViewModel的OnNavigatedTo中覆盖:

public override async void OnNavigatedTo(INavigationParameters parameters)
{
    Debug.WriteLine($"URI: {NavigationService.GetNavigationUriPath()}");
    await NavigationService.NavigateAsync("/RootPage/NavigationPage/MainPage");
    Debug.WriteLine($"URI: {NavigationService.GetNavigationUriPath()}");     
}

这是输出:

[0:] URI: /SplashPage
[0:] URI: /RootPage/NavigationPage/MainPage/SplashPage?useModalNavigation=true

我感到非常困惑,因为我认为任何以“ /”开头的导航请求都应清除导航堆栈。那么为什么SplashPage仍然存在?

2 个答案:

答案 0 :(得分:1)

用于清除导航堆栈

使用如下所示的Abosulute Uri清除所有导航堆栈

await NavigationService.NavigateAsync(new Uri("app:///RootPage/NavigationPage/MainPage", UriKind.Absolute));

在您看来,您只希望从堆栈中删除初始屏幕页面,然后可以像下面这样简单地进行更改。

await NavigationService.NavigateAsync("../RootPage/NavigationPage/MainPage");

注意:-上面的语法将从NavigationStack中清除SplashScreen(此外,如果您使用的是Arizona.forms 7+版本,此方法也将起作用)

答案 1 :(得分:1)

您遇到了一个有趣的问题!!我从未尝试过在OnNavigatedTo

中导航

您可能想与Brian Lagunas讨论OnNavigatedTo的内部工作原理,或者可以看看repo

阅读您的问题后,我能够重现相同的行为。更进一步,我在调用MainPage时增加了一些延迟,并且效果很好。

public override async void OnNavigatedTo(INavigationParameters parameters)
{
    Debug.WriteLine($"URI: {NavigationService.GetNavigationUriPath()}");
    Task.Run(async() => {
    await Task.Delay(2000);
    Device.BeginInvokeOnMainThread(async () => {
        await NavigationService.NavigateAsync("/RootPage/NavigationPage/MainPage");
    }});
    Debug.WriteLine($"URI: {NavigationService.GetNavigationUriPath()}");     
}

控制台中的输出仍然相同,但是当我在MainPage OnNavigatedTo中打印“导航”页面时,它显示正确!并且UI /导航堆栈没有SplashPage

当心::这是一种攻击,强烈建议您不要致电Task.Run