【发布时间】:2018-04-28 07:21:19
【问题描述】:
我正在开发一个带有 Prism 的 Xamarin.Forms 应用程序,我想在其中加入一个入职页面(更具体地说,是一个顶级用户福利页面,在 @ 987654321@)。
应用程序本身是围绕 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,但无济于事
我会相信这是编写应用程序时的常见要求。有什么我错过的吗?还是我必须忍受这些缺点之一?
【问题讨论】:
标签: xamarin.forms navigation prism