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



我正在开发一个带有PrismXamarin.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也没有改变任何东西。

我尝试过的其他一些事情

  • 在我的视图模型中实现了INavigationOptionsClearNavigationStackOnNavigation正在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已经启动并运行,而无需在已经可见的情况下进行构建。

不过,我希望能得到一个关于如何以棱镜方式做到这一点的答案。

相关内容

  • 没有找到相关文章

最新更新