根页面不是导航的一部分.NavigationStack集合

本文关键字:一部分 NavigationStack 集合 导航 | 更新日期: 2023-09-27 18:17:30

当我的应用程序启动时,我在我的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中,我从AppDelegate分配MainPage的给定视图

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的await调用完成,并且MainPage被替换,页面消失,我留下一个空屏幕。

我真的不想在从设置页面过渡到实际应用程序时失去动画。

根页面不是导航的一部分.NavigationStack集合

我能够解决这个问题。这主要是因为我不了解NavigationPage是如何工作的。似乎每个页面都有自己的导航堆栈。当我在页面之间导航并检查它们的NavigationStack集合时,它们总是只有一个项目。

然后我开始看App.Current.MainPage.Navigation,发现它实际上有整个堆栈(StartupPageFooPage)。然后,我能够在将FooPage推到导航堆栈之前抓住StartupPage,然后在完成到FooPage的导航后删除StartupPage。这实际上让我重置了根页面,同时保留了视图之间的过渡动画。

Page originalRootPage = App.Current.MainPage.Navigation.NavigationStack.Last();
await App.Current.MainPage.Navigation.PushAsync(new FooPage());
App.Current.MainPage.Navigation.RemovePage(originalRootPage);

我将把这个标记为已回答,当时间段已经过期,我被允许。

我想你要找的是设置:

App.Current.MainPage

到一个新的NavigationPage

这是解决我的问题。

    protected override bool OnBackButtonPressed()
    {
        foreach (Page page in Navigation.ModalStack)
        {
            page.Navigation.PopModalAsync();
        }
        return true;
    }