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



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

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

await Navigation.PushAsync(new MyNewPage());

现在在这里我想回到上一个MainPage

await Navigation.PushAsync(new MainPage());

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

由于它是LIFO,因此我将其放在内存/堆栈上。如何回忆起之前加载的MainPage?还是因为GC可以随时清洁它而感到危险?

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

await Navigation.PopAsync();

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

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

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

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

await Navigation.PopToRootAsync()

返回到堆栈底部的Page

如果"主页"可以在堆栈中的其他位置,则可能需要维护自己的Page列表

,与NavigationStack

分开。如果您不关心在MainPage和当前页面之间保持Page,则可能如下所示:

请注意,您需要创建一个单独的PageLists,因为调用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)之类的东西会很好,但现在这种方法似乎有效。

相关内容

  • 没有找到相关文章

最新更新