Xamarin.forms 为什么绝对导航URL不清除导航堆栈?

Xamarin.forms 为什么绝对导航URL不清除导航堆栈?,xamarin.forms,prism,Xamarin.forms,Prism,当我调查一个问题时,我发现了一些我觉得奇怪的事情,这个问题使得我的应用程序在导航到另一个页面后仍然停留在初始屏幕上 我设法在一个小而简单的项目中重现了这个问题。 基本上,我的Prism项目中有3个页面和视图模型:SplashPage(ContentPage)、MainPage(ContentPage)、RootPage(MasterDetailPage) 它们都是为导航以及NavigationPage注册的 以下是我的App.xaml.cs中的内容: protected override asy

当我调查一个问题时,我发现了一些我觉得奇怪的事情,这个问题使得我的应用程序在导航到另一个页面后仍然停留在初始屏幕上

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

它们都是为导航以及NavigationPage注册的

以下是我的App.xaml.cs中的内容:

protected override async void OnInitialized()
{
初始化组件();
等待NavigationService.NavigateAsync(“/SplashPage”);
}
在SplashPageViewModel的OnNavigatedTo覆盖中:

public override async void OnNavigatedTo(INavigationParameters)
{
WriteLine($“URI:{NavigationService.GetNavigationUriPath()}”);
等待NavigationService.NavigateAsync(“/RootPage/NavigationPage/MainPage”);
WriteLine($“URI:{NavigationService.GetNavigationUriPath()}”);
}
以下是输出:

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

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

用于清除导航堆栈

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

await NavigationService.NavigateAsync(new Uri("app:///RootPage/NavigationPage/MainPage", UriKind.Absolute));
在您的情况下,您似乎只希望从堆栈中删除splashscreen页面,然后您可以简单地进行如下更改

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

注意:-以上语法将清除NavigationStack中的SplashScreen(如果您使用的是prism.forms 7+版本,这也可以使用)

您遇到了一个有趣的问题!!。我从未尝试在
on导航到

您可能想与Brian Lagunas谈谈导航到
上的
的内部工作原理,或者可以查看

在阅读了《你的问题》之后,我能够重现同样的行为。更进一步,我在调用
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


注意:这是一种黑客行为,我强烈建议不要调用
任务。不必要地运行
试试这个:
等待导航服务。NavigateAsync(“app:///RootPage/NavigationPage/MainPage");谢谢,但同样的结果第一个解决方案有效,谢谢。第二个不起作用,因为只允许在NavigationPage内部进行相对导航。但这并不能解释为什么我第一个例子中的语法不起作用。是的,我希望Brian能读这篇文章。我没有检查导航堆栈本身,因为我假设从GetNavigationUriPath返回的内容正好反映了我们在堆栈中可以找到的内容。但这似乎不是真的。是的,我猜它在推页面后会在后台清理。。。因此,如果你导航“足够快”,你可能会遇到issuesSorry,但当你说“我能够重现相同的行为”时,你是说启动页面保持在主页上方吗?因为即使在我真正的应用程序中,我真的遇到了这个问题,我也无法在发布之前构建的示例应用程序中重现它:显示主页。但是导航Uri似乎是错误的。Naah只是导航Uri。。。堆栈很好“小心:这是一个黑客行为,我强烈建议不要调用任务。不必要地运行”…为什么你建议不要调用任务。不必要地运行?