Skip to main content
 首页 » 编程设计

c#之根页面不是 Navigation.NavigationStack 集合的一部分

2024年01月18日32kenshinobiy

当我的应用程序启动时,我在我的 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

的给定 View
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 被替换,页面就会消失,我'剩下一个空屏幕。

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

请您参考如下方法:

我想你要找的是设置:

App.Current.MainPage

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