Root Page不是Navigation.NavigationStack集合的一部分

Joh*_*ger 1 c# navigation ios xamarin.forms

当我的应用程序启动时,我在我的一些逻辑中根据该逻辑的结果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>());
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的app.cs中,我从中分配MainPage给定的视图AppDelegate

public class App : Xamarin.Forms.Application
{
    public void SetStartupView(ContentPage page)
    {
        this.MainPage = new NavigationPage(page);
    }
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我正在StartupPage进入该SetStartupView(Page)方法.当用户做某事时,我导航到AlbumsPage.

this.Navigation.PushAsync(new AlbumPage());
Run Code Online (Sandbox Code Playgroud)

当我这样做时,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);
}
Run Code Online (Sandbox Code Playgroud)

但是,当我看,该Navigation.NavigationStack集合包含AlbumsPage.然而,召唤this.Navigation.PopAsync()导航回到了StartupPage.

为了重置此导航堆栈,我需要做什么,以便弹出不会导航回初始页面?

更新

当我导航时,我已经能够使用它:

App.Current.MainPage = new NavigationPage(viewModelPage);
Run Code Online (Sandbox Code Playgroud)

正如@Daniel所建议的那样,这可以防止动画发生.我也试过了

await App.Current.MainPage.Navigation.PushAsync(fooPage);
App.Current.MainPage = new NavigationPage(fooPage);
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我看到新页面已转换为,但是一旦等待调用PushAsync完成,并且MainPage被替换,页面就会消失,而我将留下空白屏幕.

在从设置页面转换到实际应用程序期间,我真的不想丢失动画.

Dan*_*rda 5

我想你要找的是:

App.Current.MainPage

一个新的NavigationPage.它取代了应用程序的主页.


Joh*_*ger 5

我能够解决这个问题。这主要归结为我对 NavigationPage 的工作方式缺乏了解。似乎每个页面都有自己的导航堆栈。当我在 Pages 之间导航并检查他们的NavigationStack收藏时,他们总是只有一个项目。

然后我开始查看App.Current.MainPage.Navigation并发现它实际上拥有整个堆栈(包括StartupPageFooPage)。然后我能够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);
Run Code Online (Sandbox Code Playgroud)

当时间段到期并且我被允许时,我会将其标记为已回答。