[英]How to remove a current page from stack navigation Xamarin Forms
我很努力地做某事,但我無法解決這個問題。 我有三個頁面,一個是 MainPage、LoginUpPage 和 SignUpPage,LoginUpPage 里面有一個導航到 SignUpPage 的按鈕,我想要做的是當我完成我的邏輯導航到另一個頁面 CreatedPage,其中包含一個帶有消息的標簽 -成功,然后在 2 秒后返回到登錄頁面,問題是如果我從設備上按下后退按鈕,它將返回到帶有帶有消息的標簽的最后一頁,而我不希望那樣。 我有一個帶有 BackButton 的工具欄,可以返回到我導航的每個頁面。 到目前為止,我有這個:
登錄頁面到注冊頁面:
Navigation.PushAsync(new SignupPage());
SignUpPage 到 CreatedPage :
await Navigation.PushModalAsync(new Created());
在我的構造函數中的 CreatedPage 內部,此方法:
public async void Redirect()
{
await Task.Delay(TimeSpan.FromSeconds(2));
await Navigation.PushAsync(new LoginPage());
}
我通過這個問題知道基本上有三種方法可以導航到另一個頁面:
Navigation.PushAsync(new OtherPage()); // to show OtherPage and be able to go back
Navigation.PushAsyncModal(new AnotherPage());// to show AnotherPage and not have a Back button
Navigation.PopAsync();// to go back one step on the navigation stack
在同一個問題中有一個示例如何從堆棧中刪除頁面,但它不起作用。
item.Tapped += async (sender, e) => {
await Navigation.PushAsync (new SecondPage ());
Navigation.RemovePage(this);
};
來回點擊頁面的次數,頁面被添加到導航堆棧中。 根據點擊次數,同一頁面可能會多次出現在導航堆棧中。
如果導航堆棧上有兩個或多個頁面。
for (int PageIndex = Navigation.NavigationStack.Count; PageIndex >= 0; PageIndex--)
{
Navigation.RemovePage(Navigation.NavigationStack[PageIndex]);
}
這將刪除導航堆棧中的所有頁面,不包括主頁(或導航堆棧頂部的頁面)
或者
如果用戶在導航堆棧中留下兩個頁面,並希望將導航堆棧中的第二個頁面作為主頁面 (Navigationstack[1]) 以及移除第一頁 (Navigationstack[0]) ,其工作原理如下
if (Navigation.NavigationStack.Count == 2)
{
App.Current.MainPage.Navigation.RemovePage(Navigation.NavigationStack.First());
}
在這種情況下,您需要設置一個根頁面:
//Master Detail Page
public class RootPage : MasterDetailPage
{
MenuPage menuPage;
public RootPage()
{
menuPage = new MenuPage(this);
Master = menuPage;
Detail = new NavigationPage(new HomePage());
}
}
//Set the Root Page
public class App : Application
{
public App()
{
InitializeComponent ();
if(NewUser || NotLoggedIn)
{
MainPage = new LoginPage();
}
else
{
MainPage = new RootPage();
}
}
}
public class LoginPage : ContentPage
{
private void SignupButtonOnClicked(object sender, EventArgs eventArgs)
{
Navigation.PushAsync(new SignupPage());
}
}
public class SignupPage : ContentPage
{
private void CreatedButtonOnClicked(object sender, EventArgs eventArgs)
{
Navigation.PushModalAsync(new CreatedPage());
}
}
// Set the Login Page
public class CreatedPage : ContentPage
{
private void CreatedButtonOnClicked(object sender, EventArgs eventArgs)
{
Navigation.PushModalAsync(new LoginPage());
//Special Handel for Android Back button
if (Device.OS == TargetPlatform.Android)
Application.Current.MainPage = new LoginPage();
}
}
這樣后退按鈕將不會返回上一頁,因為它會將導航堆棧重置為根頁面,即您的登錄頁面。
我之前沒有嘗試過,但您可以嘗試以下解決方案:
檢索您的導航堆棧作為列表:
var existingPages = Navigation.NavigationStack.ToList();
然后刪除你想要的頁面
然后將您的導航堆棧設置為修改后的列表
App.Navigation.RemovePage(App.Navigation.NavigationStack.ElementAt(App.Navigation.NavigationStack.Count - 2));
導航到下一頁后將刪除頁面
App.Navigation 在哪里
公共靜態 INavigation 導航 { 獲取; 放; }
在應用類
我發現清除堆棧並在清除堆棧上打開新頁面的最簡單方法
await Navigation.PushAsync(new UserJourneysTabPage()); //Push the page you want to push
var existingPages = Navigation.NavigationStack.ToList();
//get all the pages in the stack
foreach (var page in existingPages)
{
//Check they type of the page if its not the
//same type as the newly created one remove it
if (page.GetType() == typeof(UserJourneysTabPage))
continue;
Navigation.RemovePage(page);
}
注意:如果頁面類型相同,這不會從導航堆棧中清除頁面,但您始終可以添加一個屬性來區分新創建的和舊的
我發布了這個解決方案,用於使用 linq 從導航堆棧中刪除任何所需的頁面。
在這里作為示例,我將刪除除當前活動頁面之外的所有頁面。
var currentPage = Navigation.NavigationStack[Navigation.NavigationStack.Count - 1];
var pageList = Navigation.NavigationStack.Where(y => y != currentPage).ToList();
foreach(var page in pageList)
Navigation.RemovePage(page);
以下例程非常適合我:
Using System.Linq;
......
try
{
foreach (var item in Application.Current.MainPage.Navigation.NavigationStack.ToList()
{
if (item.GetType().Name == "ClientsPage" || item.GetType().Name == "PagoPage")
{
Application.Current.MainPage.Navigation.RemovePage(item);
}
}
}
catch() {
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.