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

时间:2015-10-14 04:06:47

标签: c# ios navigation 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>());
    }
}

在我的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被替换,页面就会消失,而我将留空屏幕。

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

3 个答案:

答案 0 :(得分:5)

我认为您正在寻找的是:

App.Current.MainPage

到新的NavigationPage。它取代了申请的主页。

答案 1 :(得分:4)

我能够解决这个问题。这主要归结为我对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);

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

答案 2 :(得分:1)

这解决了我的问题。

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

        return true;
    }