我有几种情况,我想将多个页面作为一项操作进行模式推送。一种情况是在我的应用程序开始时,我想初始化我的主页并将启动页面推到它上面。我认为这是初始化应用程序的一种干净方法,因为我的主页是预先加载的,并且 spash 页面被推到它上面。当用户关闭启动页面时,我可以简单地弹出启动页面并完成。目前,我在我的应用程序类中做以下工作:
public App()
{
InitializeComponent();
MainPage mainPage = new MainPage();
SplashPage splashPage = new SplashPage();
MainPage = mainPage;
mainpage.Navigation.PushModalAsync(splashPage,false);
}
我的问题是,虽然在 android 上一切都按预期工作,但在 iOS 上,显示主页的时间很短,而不是被启动页面覆盖。这看起来不太好,对用户来说是令人恼火的。
我知道,我可以通过其他方式处理上述示例,例如将启动页面设置为主页,并在用户关闭启动页面时将其与另一个页面交换。但是我还有其他情况,在这种情况下并不容易,并且预先设计页面堆栈是合乎逻辑的。
所以,我的问题是,如何将多个页面推送到模态堆栈,而不会在 iOS 上短时间内显示每个页面。
我的答案是使用Navigation.InsertPageBefore()
.
iOS 现在建议您使启动页面看起来像主页的超级简单版本。显然,很多人不喜欢这样,因为他们想向世界展示他们时尚的启动页面。但是你也许可以用同样的想法来做这件事。如果您的启动页面是红色背景,中间有徽标,则可以将MainPage
设置为具有红色背景的空ContentPage
,然后将启动页面PushModalAsync
顶部,然后将主页添加到基本ContentPage
前面。完成后,您只需弹出Splash,用户就会盯着Main。
代码时间:
ContentPage basicSplash = new ContentPage { BackgroundColor = Color.Red };
NavigationPage nav = new NavigationPage(basicSplash); //Do Navigation Page here with basic in it
MainPage = nav; //Set basic splash
nav.Navigation.PushModalAsync(new SplashPage(), false); //Show SplashPage modal over basic
nav.Navigation.InsertPageBefore(new MainPage(), basicSplash); //You are now adding MainPage to the NavigationStack, not the ModalStack
nav.Navigation.RemovePage(basicSplash); //Remove basic splash, so now only MainPage is left sitting in NavigationStack
//Now you can do nav.PopModalAsync() when ready and the user should be looking at the MainPage since there is nothing left in the ModalStack and only MainPage is sitting in the NavigationStack
这里唯一的问题是您需要通过从堆栈中删除页面,将mainPage
设置为您的...来防止用户返回basicSplash
。MainPage
,或删除后退按钮和/或覆盖ContentPage.OnBackButtonPressed