Xamarin表单中的导航,页面之间可以自定义移动

时间:2019-05-11 20:18:54

标签: xamarin xamarin.forms xamarin.android xamarin.ios

Xamarin开发人员,

所以我有一个要求,让用户从第1页->第2页->第3页->第4页转到第4页,然后他必须返回到第2页,如果按返回按钮,他应该将其导航回第1页。

如何在Xamarin表单中实现此目标?

我这样尝试过

 Navigation.RemovePage(Navigation.NavigationStack[Navigation.NavigationStack.Count - 1]);
               _ = Navigation.PopAsync(true);

但是它给出了奇怪的动画,并且无法正常工作。

请帮助我。

1 个答案:

答案 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

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]);
    });

}