![](/img/trans.png)
[英]Xamarin Forms Navigation.PopAsync() for Master Detail Page
[英]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.