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

时间:2017-11-15 06:53:01

标签: xamarin.forms navigation prism

我正在使用 Prism 开发一个 Xamarin.Forms 应用程序,其中我想要合并一个入职页面(更具体的是一个顶级用户权益页面,跟随{ {3}})。

应用程序本身围绕NavigationPage构建,我使用

进行导航
NavigationService.NavigateAsync("/NavigationRootPage/MainPage")

在我的App()中。在第一次开始时,我想显示入门页面而我正在遇到一些问题。

第一种方法是使用

导航到MainPage
_navigationService.NavigateAsync("/NavigationRootPage/MainPage")

来自我的viewmodel,当用户点击使用入门!按钮时。这种工作方式也很丑陋,因为这种绝对导航会立即破坏对象页面而不会使转换动画化。此外,当目标页面被销毁时,MainPage将被构建,这将需要一个小的,但明显的时间。实际上,用户会注意到MainPage正在构建,这看起来并不平滑。

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

_navigationService.NavigateAsync("NavigationRootPage/MainPage")

这种方式更顺畅,使用过渡动画,动画完成后,MainPage已准备就绪。但同样存在一个主要缺点。您可以导航回onbaording页面,我们也不想要。并且 - 据我所知 - 也没有(干净的)方法从导航堆栈中删除页面。我尝试在我的入门页面上调用PageUtility.DestroyPage,但这只会使事情变得更糟,因为它似乎保留了页面,但是破坏了视图模型,导致我的入门页面在按下后退按钮时没有数据显示。

我的第三种方法根本不起作用,虽然它对我来说似乎很有希望。在我的App()中,我将导航页面与主页面一起推送,然后是我的入门页面模式

NavigationService.NavigateAsync("/NavigationRootPage/MainPage");
NavigationService.NavigateAsync("OnboardingPage", useModalNavigation: true);

然后在我的viewmodel

_navigationService.GoBackAsync(useModalNavigation: true)

但这种方法

  • 显示了NavigationPage的标题,尽管onbaording页面应该显示为模态
  • 拒绝GoBackAsync - 在调用此方法时,没有任何反应

等待对NavigateAsync的第一次调用也没有改变任何内容。

一些其他的事情我已经尝试了

  • 在我的视图模型中实现INavigationOptions ClearNavigationStackOnNavigationtrue
  • 在显示Application.MainPage之后尝试设置NavigationPage,但无效

我会相信这是编程应用程序时常见要求的王者。有没有我错过的东西?或者我将不得不忍受其中一个缺点?

2 个答案:

答案 0 :(得分:1)

我认为你是在思考这个问题。如果您想首先显示您的Onborading页面,请先导航到它。

`NavigateAsync( “NavigationPage / OnboardingPage”);

或者,如果您希望将MainPage放在堆栈中,请使用深层链接

启动应用程序

`NavigateAsync( “NavigationPage /的MainPage / OnboardingPage”);

如果您不想显示导航标题,只需将其隐藏为新手入页。

除非您想完全重置导航堆栈(相当于MainPage = new MainPage()),否则请勿使用绝对导航。

答案 1 :(得分:0)

已经找到了一个解决方案,这个解决方案并不是最漂亮的(实际上非​​常难看)但是有效。

在我的MainPage视图模型中,我实施了INavigatingAware并导航到OnboardingPage模态

public async void OnNavigatingTo(NavigationParameters parameters)
{
    await _navigationService.NavigateAsync("LandingPage", useModalNavigation: true);
}

但是,使用

删除moal页面
this._navigationService.GoBackAsync(useModalNavigation: true);

无法按预期工作。模态不会被删除(虽然它应该以这种方式查看代码,但我没有设法使用Re#生成的PDB进行调试)。因此,我必须采用丑陋的(非MVVM)方式为Button.Click创建一个事件处理程序并手动删除模式

private void Button_OnClicked(object sender, EventArgs e)
{
    this.Navigation.PopModalAsync();
}

这将通过动画顺利返回MainPage我的MainPage已经启动并运行,而不会在已经可见的情况下构建。

尽管如此,我仍然很欣赏如何以 Prism 的方式做到这一点。