Подтвердить что ты не робот

Как PopAsync более 1 страницы в Xamarin Forms Navigation?

В моем приложении я нажимаю страницы с помощью NavigationPage, и на каком-то этапе я хочу вернуться к предыдущей странице в стеке. Это моя структура:

NavigationPage > Page1 > Page2 > Page3 > Page4

Как я могу PopAsync вернуться к странице2 непосредственно из страницы4, не проходя через страницу?

4b9b3361

Ответ 1

Если у вас есть счет, который вы хотели бы поп, это работает очень хорошо.

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

Ответ 2

Я пытался сделать то же самое - то, что я закончил, - это немного взломать, но работает и удерживает кнопку "Назад" на странице 2 на странице 1.

В принципе,

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

Что это значит, сначала, если присутствует, удалите page3. Теперь, когда это исчезло, оно появляется, и вы вернулись на страницу 2.

Ответ 3

Если у вас есть счет, который вы хотели бы поп-музыки, это действительно хорошо для меня.

    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();

Ответ 4

Я пришел с решением, которое может вернуться к определенной странице, если у вас есть ссылка на него:

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