【问题标题】:Xamarin best habits on switching between pages?Xamarin 在页面之间切换的最佳习惯?
【发布时间】:2017-05-25 13:57:48
【问题描述】:

我是Xamarin.Forms 的新手,我想知道如何切换到“以前加载的”页面。

假设我的应用程序运行,它加载(作为第一页)我的MainPage。在那里我调整了一些按钮/切换(更改状态),然后单击将加载另一个页面的按钮(使用 Navigation 模型):

await Navigation.PushAsync(new MyNewPage());

现在这里我想回到之前的MainPage

await Navigation.PushAsync(new MainPage());

但此时,所有内容/按钮状态都消失了(基本上它会创建一个新的MainPage)。

由于它是 LIFO,我希望将它放在内存/堆栈上。我如何才能回忆起之前加载的MainPage?还是因为 GC 可以随时清理它,所以很危险?

请注意,在这种特定情况下,这会起作用(因为我只是返回一次):

await Navigation.PopAsync();

但我想使用选择性方法(在我所在的地方调用我需要的东西,学习整个概念)。

【问题讨论】:

    标签: c# xamarin navigation xamarin.forms


    【解决方案1】:

    需要注意的一点是,您用于 Push 和 Pop 的 Navigation 对象有一个 NavigationStack 属性,您可以使用它来获取以前推送的页面 - 假设您没有弹出它们。

    据我所知,没有任何方法可以直接导航到堆栈中的现有 Page,因此您可能需要在方法中获得一些创意。

    如果MainPage 始终位于NavigationStack 的底部,则可以使用

    await Navigation.PopToRootAsync()
    

    返回堆栈底部的Page

    如果“MainPage”可以在堆栈中的其他位置,您可能需要维护自己的Pages 列表与NavigationStack 分开。

    如果您不关心将Pages 保持在MainPage 和您的当前页面之间,则以下方法可能会起作用:

    请注意,您需要创建一个单独的 ListPages 以删除,因为在 foreach 循环中的 NavigationStack 上调用 RemovePage() 有时会导致异常,效果类似于“枚举无法完成,集合已更改”:

    List<Page> pagesToRemove = new List<Page>();
    foreach( Page page in Navigation.NavigationStack )
    {
        if( page.GetType() != typeof(MainPage) && page != Navigation.NavigationStack.Last() )
        {
            pagesToRemove.Add(page);
        }
    } 
    // pagesToRemove now contains all Pages between your current page and MainPage
    
    foreach( Page pageToRemove in pagesToRemove )
    {
        Navigation.RemovePage(pageToRemove);
    }
    // the NavigationStack only contains MainPage (now the root) and your current page
    
    // Pop to MainPage
    await Navigation.PopAsync();
    

    有朝一日拥有NavigateTo(Page) 或类似名称会很好,但目前这种方法似乎可行。

    【讨论】:

      猜你喜欢
      • 2019-03-17
      • 1970-01-01
      • 2015-10-27
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多