我正在使用 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
ClearNavigationStackOnNavigation
为true
Application.MainPage
之后尝试设置NavigationPage
,但无效我会相信这是编程应用程序时常见要求的王者。有没有我错过的东西?或者我将不得不忍受其中一个缺点?
答案 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 的方式做到这一点。