簡體   English   中英

如何在 Xamarin Forms Navigation 中 PopAsync 超過 1 頁?

[英]How to PopAsync more than 1 page in Xamarin Forms Navigation?

在我的應用程序中,我使用NavigationPage推送頁面,並且在某個階段我想返回到堆棧中的上一頁。 這是我的結構:

導航頁面 > 第 1 頁 > 第 2 頁 > 第 3 頁 > 第 4 頁

如何在不通過 Page3 的情況下直接從 Page4 PopAsync回到 Page2?

如果您有一個想要彈出的計數,這非常有效。

for (var counter = 1; counter < BackCount; counter++)
{
    Navigation.RemovePage(Navigation.NavigationStack[Navigation.NavigationStack.Count - 2]);
}
await Navigation.PopAsync();

我試圖做同樣的事情 - 我最終做的有點像黑客,但確實有效並將第 2 頁的后退按鈕保持到第 1 頁。

基本上,

var page3 = _navi.NavigationStack.FirstOrDefault(p => p is Page3Type);
if(page3 != null)
{
    _navi.RemovePage(page3);
}
await navi.PopAsync();

這樣做是首先(如果存在)刪除 page3。 現在它消失了,它彈出,你又回到了第 2 頁。

我提供了一個解決方案,只要您有參考它就可以返回到特定頁面:

protected async Task PopToPage(Page destination)
{
    if (destination == null) return;

    //First, we get the navigation stack as a list
    var pages = Navigation.NavigationStack.ToList();

    //Then we invert it because it's from first to last and we need in the inverse order
    pages.Reverse();

    //Then we discard the current page
    pages.RemoveAt(0);

    foreach (var page in pages)
    {
        if (page == destination) break; //We found it.

        toRemove.Add(page);
    }

    foreach (var rvPage in toRemove)
    {
        navigation.RemovePage(rvPage);
    }

    await Navigation.PopAsync();
}

如果你有一個想要彈出的計數,這對我來說非常有效。

for(i=1; i < size; i++)
    {
    if (Device.OS == TargetPlatform.Android)
        {
            Navigation.RemovePage(Navigation.NavigationStack[Navigation.NavigationStack.Count - 1]);
        }
        else
        {
            Navigation.RemovePage(Navigation.NavigationStack[Navigation.NavigationStack.Count - 2]);
        }
    }
    await Navigation.PopAsync();

這對我來說非常有效:

我設置了一個計數器並拋出一個 DisplayAlert 來找出我需要刪除多少頁

var x = Navigation.NavigationStack.Count();
DisplayAlert("Page Count", x.ToString(), "OK");

然后用它來刪除我需要回退的數字。

Navigation.RemovePage(Navigation.NavigationStack[Navigation.NavigationStack.Count - 2]);
await Navigation.PopAsync();

只需刪除 2 頁

Application.Current.MainPage.Navigation.RemovePage(Application.Current.MainPage.Navigation.NavigationStack[Application.Current.MainPage.Navigation.NavigationStack.Count - 2]);
            Application.Current.MainPage.Navigation.PopAsync();

在 Visual Studio 2019 Enterprise 中運行良好

這是@Alexei Humeniy 解決方案的一個更新

    public static async Task PopToPage<T>(INavigation navigation)
    {
        //First, we get the navigation stack as a list
        var pages = navigation.NavigationStack.ToList();

        //Then we invert it because it's from first to last and we need in the inverse order
        pages.Reverse();

        //Then we discard the current page
        pages.RemoveAt(0);

        var toRemove = new List<Page>();

        var tipoPagina = typeof(T);

        foreach (var page in pages)
        {
            if (page.GetType() == tipoPagina)
                break;

            toRemove.Add(page);
        }

        foreach (var rvPage in toRemove)
        {
            navigation.RemovePage(rvPage);
        }

        await navigation.PopAsync();
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM