如何从堆栈导航Xamarin Forms中删除当前页面

时间:2016-09-08 14:24:18

标签: c# xamarin.forms

我正在努力做点什么,但我无法解决这个问题。我有三个页面,一个是MainPage,LoginUpPage和SignUpPage,在LoginUpPage里面有一个导航到SignUpPage的按钮,我想要做的是当我完成我的逻辑导航到另一个页面CreatedPage,whitch包含一个带有消息的标签 - 成功然后经过2秒GoBack到LoginPage,问题是如果我按下来自设备的后退按钮它将返回到带有消息的标签的最后一页,我不希望这样。我有一个带有BackButton的工具栏,可以返回我导航的每个页面。到目前为止,我有这个:

登录页面到SignUpPage:

Navigation.PushAsync(new SignupPage());

SignUpPage to CreatedPage:

await Navigation.PushModalAsync(new Created());

在我的Contructor中的CreatedPage内,此方法:

    public async void Redirect()
    {
        await Task.Delay(TimeSpan.FromSeconds(2));
        await Navigation.PushAsync(new LoginPage());
    }

我知道这个question基本上有三种导航到另一个页面的方法:

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

};

7 个答案:

答案 0 :(得分:2)

在这种情况下,您需要设置根页面:

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

    }

这样,后退按钮不会返回上一页,因为它会将导航堆栈重置为根页面,即您的LoginPage。

答案 1 :(得分:2)

来回点击时间页的数量,页面被添加到导航堆栈。根据点击次数,可能会在导航堆栈中多次显示同一页面。

如果导航堆栈中有两个或多个页面。

for (int PageIndex = Navigation.NavigationStack.Count; PageIndex >= 0; PageIndex--)
{  
    Navigation.RemovePage(Navigation.NavigationStack[PageIndex]);
}

这将删除导航堆栈中除主页面(或导航堆栈顶部的页面)之外的所有页面

OR

如果用户在导航堆栈中留下两个页面,并希望将导航堆栈中的第二页作为主页面(Navigationstack [1])以及删除第一页(Navigationstack [0]),则其工作方式如下

if (Navigation.NavigationStack.Count == 2)
{
    App.Current.MainPage.Navigation.RemovePage(Navigation.NavigationStack.First());
}

答案 2 :(得分:0)

我之前没试过,但你可以尝试这个解决方案:

以列表形式检索导航堆栈:

var existingPages = Navigation.NavigationStack.ToList();

然后删除您想要的页面

然后将导航堆栈设置为修改后的列表

答案 3 :(得分:0)

App.Navigation.RemovePage(App.Navigation.NavigationStack.ElementAt(App.Navigation.NavigationStack.Count - 2));

导航到下一页后

将删除页面

App.Navigation的位置

public static INavigation Navigation {get;组; }

在app类

答案 4 :(得分:0)

我发现清除堆栈并在透明堆栈上打开新页面的最简单方法

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

注意:如果页面的类型相同,则不会从导航堆栈中清除该页面,但是您始终可以添加属性以区分新创建的页面和旧页面。

答案 5 :(得分:0)

我发布了此解决方案,以便使用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);

答案 6 :(得分:-1)

以下例程非常适合我:

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