簡體   English   中英

如何從堆棧導航 Xamarin Forms 中刪除當前頁面

[英]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.

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