Xamarin在页面之间切换的最佳习惯是什么?

时间:2017-05-25 13:57:49

标签: c# xamarin navigation xamarin.forms

我是Xamarin.Forms的新人,我想知道如何切换到先前加载的""页。

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

await Navigation.PushAsync(new MyNewPage());

现在我想回到之前的MainPage

await Navigation.PushAsync(new MainPage());

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

由于它是一个LIFO,我的方面是它在内存/堆栈上。如何回忆以前加载的MainPage?或者它是危险的,因为GC可以在任何时候清理它?

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

await Navigation.PopAsync();

但是我想使用一个有选择性的approch(在我所在的位置调用我需要的东西,学习整个概念)。

1 个答案:

答案 0 :(得分:1)

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

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

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

await Navigation.PopToRootAsync()

返回堆栈底部的Page

如果' MainPage'可以在堆栈的其他位置,您可能必须维护自己的Page列表,与NavigationStack分开。

如果您不关心将Page保持在MainPage与当前页面之间,则以下内容可能会有效:

请注意,您需要创建单独的List PageRemovePage()来删除,因为NavigationStack循环中的foreach上的调用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(); 会导致有时会出现例外情况,因为&#34;枚举无法完成,集合已经改变&#34;:

NavigateTo(Page)

有一天,拥有{{1}}之类的东西会很不错,但现在这种方法似乎有效。