我有几种情况,我想将多个页面模拟为一个动作。一种情况是在我的应用程序开始时,我想初始化我的主页并在它上面推一个Splash-Page。我认为这是一种初始化应用程序的简洁方法,因为我的主页面是预先加载的,并且spash页面被推到它上面。当用户关闭启动页面时,我只需弹出启动页面即可完成。目前我在我的应用程序类中进行了以下操作:
public App()
{
InitializeComponent();
MainPage mainPage = new MainPage();
SplashPage splashPage = new SplashPage();
MainPage = mainPage;
mainpage.Navigation.PushModalAsync(splashPage,false);
}
我的问题是,虽然在Android上一切都按预期工作,但在iOS上显示Mainpage的时间很短,而不是由splash页面覆盖。这看起来不太好,对用户来说很不自在。
我知道,我可以通过其他方式处理上述示例,例如将启动页面设置为主页面,并在用户解除启动页面时将其与另一个页面交换。但是我还有其他情况,它不是那么容易,而且它在前面设计页面堆栈的逻辑恰当。
所以,我的问题是,如何在不在iOS上短时间内显示每个页面的情况下将多个页面推送到模态堆栈。
答案 0 :(得分:5)
我的回答是使用Navigation.InsertPageBefore()
。
iOS现在建议您使您的启动页面看起来像主页的超级简单版本。显然很多人不喜欢这样,因为他们想向世界展示他们时尚的泼溅页面。但是你可能也可以使用同样的想法。如果您的启动页面是红色背景,中间有徽标,则可以将MainPage
设置为红色背景的空ContentPage
,然后将PushModalAsync
启动页面设置在顶部,然后添加您的MainPage在基本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
这里唯一的问题是,您需要阻止用户从堆栈中删除页面,将basicSplash
设置为您的.... {{1},以阻止用户返回mainPage
通过删除后退按钮和/或覆盖MainPage