当我的应用开始时,我在AppDelegate
中有一些逻辑,并根据该逻辑的结果为MainPage
分配页面。
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init ();
// .....
if(authorizationStatus == PhotoLibraryAuthorizationStatus.Authorized)
{
bokehApp.SetStartupView(serviceLocator.GetService<AlbumsPage>());
}
else
{
bokehApp.SetStartupView(serviceLocator.GetService<StartupPage>());
}
}
在我的app.cs中,我从MainPage
AppDelegate
给定的视图
public class App : Xamarin.Forms.Application
{
public void SetStartupView(ContentPage page)
{
this.MainPage = new NavigationPage(page);
}
}
在这种情况下,我将StartupPage
传递给SetStartupView(Page)
方法。当用户执行某些操作时,我会导航到AlbumsPage
。
this.Navigation.PushAsync(new AlbumPage());
当我这样做时,AlbumPage
被创建并导航到;它的Navigation.NavigationStack
集合只包含它自己,而不是它刚刚导航的页面。我想做的是阻止调用this.Navigation.PopAsync()
导航回StartupPage
,这是目前正在发生的事情。
最初我只是运行循环并弹出原始页面,然后删除所有剩余页面,在本例中为StartupPage
。
// Grab the current page, as it is about to become our new Root.
var navigatedPages = this.Navigation.NavigationStack.ToList();
Page newRootPage = navigatedPages.Last();
// Dont include the current item on the stack in the removal.
navigatedPages.Remove(newRootPage);
while(navigatedPages.Count > 0)
{
Page currentPage = navigatedPages.Last();
this.Navigation.RemovePage(currentPage);
}
但是,当我查看时,Navigation.NavigationStack
集合仅包含AlbumsPage
。然而,呼叫this.Navigation.PopAsync()
会导航回StartupPage
。
为了重置此导航堆栈,我需要做什么,以便弹出不会导航回初始页面?
当我导航时,我已经能够使用它了:
App.Current.MainPage = new NavigationPage(viewModelPage);
正如@Daniel所建议的那样,这可以防止动画发生。我也试过
await App.Current.MainPage.Navigation.PushAsync(fooPage);
App.Current.MainPage = new NavigationPage(fooPage);
当我执行此操作时,我看到新页面已转换为,但是一旦等待PushAsync
上的调用完成,并且MainPage
被替换,页面就会消失,而我将留空屏幕。
我真的不想在从设置页面转换到实际应用程序时丢失动画。
答案 0 :(得分:5)
我认为您正在寻找的是:
App.Current.MainPage
到新的NavigationPage
。它取代了申请的主页。
答案 1 :(得分:4)
我能够解决这个问题。这主要归结为我对NavigationPage的工作原理缺乏了解。似乎每个页面都有自己的导航堆栈。当我在Pages之间导航并检查他们的NavigationStack
集合时,他们总是只有一个项目。
然后我开始查看App.Current.MainPage.Navigation
并发现它实际上有整个堆栈(StartupPage
和FooPage
)。然后我可以在将StartupPage
推到导航堆栈之前抓取FooPage
,然后在导航到StartupPage
完成后删除FooPage
。这基本上让我重置根页面,同时保持视图之间的过渡动画。
Page originalRootPage = App.Current.MainPage.Navigation.NavigationStack.Last();
await App.Current.MainPage.Navigation.PushAsync(new FooPage());
App.Current.MainPage.Navigation.RemovePage(originalRootPage);
当时间段到期且我被允许时,我会将此标记为已回答。
答案 2 :(得分:1)
这解决了我的问题。
protected override bool OnBackButtonPressed()
{
foreach (Page page in Navigation.ModalStack)
{
page.Navigation.PopModalAsync();
}
return true;
}