尽管我正在调查一个问题,即使导航到另一页面后,该问题仍使我的应用程序仍停留在初始屏幕上,但我发现有些东西对我来说很奇怪。
我设法在一个小型简单项目中重现了该问题。 基本上,我的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仍然存在?
答案 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