我正在开发一个带有Prism的Xamarin.Forms应用程序,我想在其中合并一个入门页面(更具体的顶级用户福利页面,遵循Material Design指南)。
应用程序本身是围绕我导航到的NavigationPage
构建的
NavigationService.NavigateAsync("/NavigationRootPage/MainPage")
在我的App()
.在第一次启动时,我想改为显示入职页面,但我在正确处理它时遇到了很多问题。
我的第一个方法是导航到MainPage
_navigationService.NavigateAsync("/NavigationRootPage/MainPage")
从我的视图模型中,当用户单击">开始使用!"按钮时。这种工作方式也有些丑陋,因为这种绝对导航会立即破坏登船页面,而不会对过渡进行动画处理。此外,在销毁登机页面的那一刻,将构建MainPage
,这将需要少量但明显的时间。实际上,用户会注意到正在构建MainPage
,它看起来根本不平滑。
我的第二种方法是从我的视图模型以相对的方式导航。
_navigationService.NavigateAsync("NavigationRootPage/MainPage")
使用过渡动画,这工作得更流畅,动画完成后,MainPage
已经准备就绪。但同样有一个主要缺点。您可以导航回 onbaording 页面,我们也不想这样做。而且 - 据我所知 - 也没有(干净的)方法可以从导航堆栈中删除页面。我尝试在我的入职页面上调用PageUtility.DestroyPage
,但这只会使事情变得更糟,因为它似乎保留了页面,但破坏了视图模型,导致我的入职页面在按下后退按钮时显示没有数据。
我的第三种方法根本没有奏效,尽管它对我来说似乎很有希望。在我的App()
中,我用主页推送了我的导航页面,然后是我的入职页面模式
NavigationService.NavigateAsync("/NavigationRootPage/MainPage");
NavigationService.NavigateAsync("OnboardingPage", useModalNavigation: true);
然后在我的观点模型中
_navigationService.GoBackAsync(useModalNavigation: true)
但这种方法
- 显示了
NavigationPage
的标题,尽管 onbaording 页面应该显示为模态 - 拒绝
GoBackAsync
- 调用此方法时,没有任何反应
等待第一次打电话给NavigateAsync
也没有改变任何东西。
我尝试过的其他一些事情
- 在我的视图模型中实现了
INavigationOptions
,ClearNavigationStackOnNavigation
正在true
- 显示我的
NavigationPage
后尝试设置Application.MainPage
,但无济于事
我会相信这是编写应用程序时常见要求的王者。我错过了什么吗?还是我将不得不忍受这些缺点之一?
我认为你想多了。 如果您想先显示您的 Onborading 页面,请先导航到它。
'NavigateAsync("NavigationPage/OnboardingPage");
或者,如果您希望在堆栈中包含主页,请使用深层链接启动应用程序
'NavigateAsync("NavigationPage/MainPage/OnboardingPage");
如果不想显示导航标题,只需将其隐藏在载入页面中即可。
除非要完全重置导航堆栈(相当于MainPage = new MainPage()
),否则不要使用绝对导航。
我找到了一个解决方案,这不是最美丽的解决方案(它实际上很丑陋),但有效。
在我的MainPage
视图模型中,我实现了INavigatingAware
并以模式导航到我的OnboardingPage
public async void OnNavigatingTo(NavigationParameters parameters)
{
await _navigationService.NavigateAsync("LandingPage", useModalNavigation: true);
}
但是,删除摩尔页面
this._navigationService.GoBackAsync(useModalNavigation: true);
无法按预期工作。模式未被删除(尽管它应该通过查看代码以这种方式工作,但我无法使用 Re# 生成的 PDB 进行调试)。因此,我不得不走丑陋的(非 MVVM)方式并为Button.Click
创建一个事件处理程序并手动删除模式
private void Button_OnClicked(object sender, EventArgs e)
{
this.Navigation.PopModalAsync();
}
这将通过动画顺利地返回到我的MainPage
,并且我的MainPage
已经启动并运行,而无需在已经可见的情况下进行构建。
不过,我希望能得到一个关于如何以棱镜方式做到这一点的答案。