Xamarin.forms 如何使用Prism.Forms实现入职页面?

Xamarin.forms 如何使用Prism.Forms实现入职页面?,xamarin.forms,navigation,prism,Xamarin.forms,Navigation,Prism,我正在开发一个带有Prism的Xamarin.Forms应用程序,我想在其中加入一个入职页面(更具体地说是一个顶级用户利益页面,如下所示) 应用程序本身是围绕一个NavigationPage构建的,我可以用它导航 NavigationService.NavigateAsync("/NavigationRootPage/MainPage") 在我的应用程序()中。在第一次开始时,我想显示入职页面,而我有相当多的问题,让它正确 我的第一个方法是使用 _navigationService.Navig

我正在开发一个带有Prism的Xamarin.Forms应用程序,我想在其中加入一个入职页面(更具体地说是一个顶级用户利益页面,如下所示)

应用程序本身是围绕一个
NavigationPage
构建的,我可以用它导航

NavigationService.NavigateAsync("/NavigationRootPage/MainPage")
在我的
应用程序()
中。在第一次开始时,我想显示入职页面,而我有相当多的问题,让它正确

我的第一个方法是使用

_navigationService.NavigateAsync("/NavigationRootPage/MainPage")
在我的viewmodel中,当用户单击Get Start!按钮这种工作方式也有点难看,因为这种绝对导航会立即破坏oboarding页面,而不会设置过渡动画。此外,在oboarding页面被破坏的那一刻,将构建
主页
,这将花费一小部分时间,但值得注意。实际上,用户会注意到正在构建的
主页
,它看起来一点也不平滑

我的第二种方法是从我的viewmodel以相对的方式导航

_navigationService.NavigateAsync("NavigationRootPage/MainPage")
对于过渡动画,这会更加平滑,动画完成后,
主页
已经准备就绪。但同样有一个主要的缺点。您可以导航回onbaording页面,我们也不需要它。而且——据我所知——也没有(干净的)方法从导航堆栈中删除页面。我尝试在我的入职页面上调用
PageUtility.DestroyPage
,但这只会让事情变得更糟,因为它似乎保留了页面,但破坏了viewmodel,导致按下“后退”按钮时,我的入职页面显示时没有数据

我的第三种方法根本不起作用,尽管对我来说似乎很有希望。在我的
App()
中,我用主页推我的导航页面,然后推我的入职页面

NavigationService.NavigateAsync("/NavigationRootPage/MainPage");
NavigationService.NavigateAsync("OnboardingPage", useModalNavigation: true);
然后在我的viewmodel中

_navigationService.GoBackAsync(useModalNavigation: true)
但这种方法

  • 显示了
    导航页面的标题
    ,尽管onbaording页面应显示为模式页面
  • 拒绝
    GoBackAsync
    -调用此方法时,不会发生任何事情
等待对
NavigateAsync
的第一次调用也没有改变任何内容

有些东西我试过了

  • 在my viewmodel中使用
    ClearNavigationStackOnNavigation
    true时实现
    INavigationOptions
  • 在显示my
    NavigationPage
    后尝试设置
    Application.MainPage
    ,但无效

我相信这是编写应用程序时的一个常见要求。我错过了什么吗?或者我必须忍受其中的一个缺点吗?

我已经找到了一个解决方案,它不是最漂亮的(实际上很难看),但很有效

在我的
MainPage
s视图模型中,我实现了
INavigatingAware
,并以模式导航到我的
OnboardingPage

public async void OnNavigatingTo(NavigationParameters parameters)
{
    await _navigationService.NavigateAsync("LandingPage", useModalNavigation: true);
}
但是,使用删除moal页时

this._navigationService.GoBackAsync(useModalNavigation: true);
没有按预期工作。模式没有被删除(虽然从查看代码时它应该是这样工作的,但我没有设法用重新生成的PDB进行调试)。因此,我不得不采用丑陋(非MVVM)的方式,为
按钮创建一个事件处理程序

private void Button_OnClicked(object sender, EventArgs e)
{
    this.Navigation.PopModalAsync();
}
这将通过动画平稳地返回到my
MainPage
,my
MainPage
已启动并运行,但尚未在可见时建立


不过,我还是希望你能给我一个关于如何用棱镜的方法来做这件事的答案。

我觉得你想得太多了。如果你想先显示你的Onborading页面,那就先导航到它

`导航同步(“导航页面/车载页面”)

或者,如果你想将主页放在堆栈中,那么用deeplink启动应用程序

`导航同步(“导航页面/主页/车载页面”)

如果您不想显示导航标题,只需在入职页面中将其隐藏即可


不要使用绝对导航,除非您想完全重置导航堆栈(相当于
MainPage=newmainpage()
)。

我可能想得太多了;)工作起来很有魅力,但我仍然想知道为什么我不能用
GoBackAsync
关闭一个模态。我想这也解决了我刚刚要解决的另一个问题。非常感谢你