在 Xamarin 窗体中导航,在页面之间自定义移动



嗨,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一起使用,但不同的是,我在PushAsyncpage4 后立即执行此删除,因此一旦您从第 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]);
});
}

最新更新