Xamarin开发人员,
所以我有一个要求,让用户从第1页->第2页->第3页->第4页转到第4页,然后他必须返回到第2页,如果按返回按钮,他应该将其导航回第1页。
如何在Xamarin表单中实现此目标?
我这样尝试过
Navigation.RemovePage(Navigation.NavigationStack[Navigation.NavigationStack.Count - 1]);
_ = Navigation.PopAsync(true);
但是它给出了奇怪的动画,并且无法正常工作。
请帮助我。
答案 0 :(得分:0)
首先:如果您正在使用
Navigation.RemovePage(Navigation.NavigationStack[Navigation.NavigationStack.Count - 1]);
来自 page4 ,Navigation.NavigationStack.Count - 1 = 3
,是NavigationStack
中 page4 的索引( page1 具有索引0!)。
我认为您应该使用
Navigation.RemovePage(Navigation.NavigationStack[Navigation.NavigationStack.Count - 2]);
相反...
更多评论:
Shell (可从 Xamarin.Forms 4.0 获得)旨在简化应用程序中Navigation
的管理。 XF 4.0 会在几周内发布,因此也许值得等待(X.F 4.0 is at the moment in pre-release,并且您现在可以使用 Shell 功能给它一个机会!)。
a)为了返回首页(根页),您可以使用
Navigation.PopToRootAsync();
b)为了从 page4 弹出到 page2 ,我还将该技术与Navigation.RemovePage
一起使用,但是区别在于我会立即执行此删除操作在我PushAsync
到 page4 之后,因此,一旦您从 page4 调用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]);
});
}