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被替换,页面就会消失,而我将留下空白屏幕.
在从设置页面转换到实际应用程序期间,我真的不想丢失动画.
我能够解决这个问题。这主要归结为我对 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);
Run Code Online (Sandbox Code Playgroud)
当时间段到期并且我被允许时,我会将其标记为已回答。
| 归档时间: |
|
| 查看次数: |
5056 次 |
| 最近记录: |