嗨,Xamarin Developers,
所以我有一个要求,用户从第 1 页 -> 第 2 页 -> 第3 页 ->第 4 页和第 4 页之后,他必须返回第 2 页,如果他按后退按钮,他应该将其导航回第 1 页。
如何在Xamarin Forms中实现这一点。
我试过这样,
Navigation.RemovePage(Navigation.NavigationStack[Navigation.NavigationStack.Count - 1]);
_ = Navigation.PopAsync(true);
但它提供了奇怪的动画并且无法正常工作。
请帮我解决这个问题。
首先:如果你正在使用
Navigation.RemovePage(Navigation.NavigationStack[Navigation.NavigationStack.Count - 1]);
从第 4 页开始,Navigation.NavigationStack.Count - 1 = 3
,这是NavigationStack
中第4页的索引(第 1 页的索引为 0!
我认为你应该使用
Navigation.RemovePage(Navigation.NavigationStack[Navigation.NavigationStack.Count - 2]);
相反。。。
进一步评论:
使用 Shell/Xamarin.Forms 4.0
Shell可从Xamarin.Forms 4.0获得,旨在简化应用程序中Navigation
的管理。XF4.0 将在几周内发布,所以也许值得等待它(X.F 4.0目前处于预发布阶段,如果您想给它一个机会,您现在可以使用Shell功能!
传统方式
a) 为了返回第一页(根页面),您可以使用
Navigation.PopToRootAsync();
b) 为了从第 4 页弹出到第 2页,我也将该技术与Navigation.RemovePage
一起使用,但不同的是,我在PushAsync
到page4 后立即执行此删除,因此一旦您从第 4 页调用PopAsync()
,它就会直接弹出到page2,而不必在那时删除任何内容(请参阅下面的代码)。请尝试这种方式,如果您成功,请告诉我:)
private async Task PushMyPage4RemovingCurrentPageFromNavigationStack()
{
var currentPage = ((NavigationPage)mainPage).CurrentPage as MyPage3;
await currentPage.Navigation.PushAsync(new MyPage4());
await Task.Run(() =>
{
// At this point MyPage4 is already pushed, so it is now the CurrentPage.
var newCurrentPage = ((NavigationPage)mainPage).CurrentPage;
IReadOnlyList<Page> navStack = newCurrentPage.Navigation.NavigationStack;
// If not moved to main thread in iOS we get:
//
// UIKit.UIKitThreadAccessException: UIKit Consistency error: you are
// calling a UIKit method that can only be invoked from the UI thread.
//
if (Device.RuntimePlatform == Device.iOS)
Device.BeginInvokeOnMainThread(() => newCurrentPage.Navigation.RemovePage(navStack[navStack.Count - 2]));
else
newCurrentPage.Navigation.RemovePage(navStack[navStack.Count - 2]);
});
}