C# Xamarin在页面之间切换的最佳习惯?
我是Xamarin.Forms的新手,我想知道如何切换到“以前加载的”页面 假设我的应用程序运行,并加载(作为第一页)我的C# Xamarin在页面之间切换的最佳习惯?,c#,xamarin,navigation,xamarin.forms,C#,Xamarin,Navigation,Xamarin.forms,我是Xamarin.Forms的新手,我想知道如何切换到“以前加载的”页面 假设我的应用程序运行,并加载(作为第一页)我的MainPage。在那里,我调整了一些按钮/切换(更改状态),然后单击一个按钮,将加载另一个页面(使用导航模型): 现在我想回到上一个MainPage await Navigation.PushAsync(new MainPage()); 但此时,所有内容/按钮状态都消失了(基本上,它创建了一个新的主页) 由于它是后进先出的,我想把它放在内存/堆栈上。如何回忆以前加载的主页
MainPage
。在那里,我调整了一些按钮/切换(更改状态),然后单击一个按钮,将加载另一个页面(使用导航
模型):
现在我想回到上一个MainPage
await Navigation.PushAsync(new MainPage());
但此时,所有内容/按钮状态都消失了(基本上,它创建了一个新的主页
)
由于它是后进先出的,我想把它放在内存/堆栈上。如何回忆以前加载的主页
?或者GC可以在任何时候清洗它,这是否危险
请注意,在这种特定的情况下,这是可行的(因为我只回过一次):
但是我想使用一种选择性的方法(将我需要的东西调用到我所在的位置,学习整个概念)。需要注意的一点是,您用于推送和弹出的
导航对象有一个NavigationStack
属性,您可以使用它来获取以前推送的页面——假设您没有弹出它们
据我所知,没有任何方法可以直接导航到堆栈中现有的页面
,因此您可能需要在方法上有所创新
如果MainPage
始终位于NavigationStack
的底部,则可以使用
await Navigation.PopToRootAsync()
返回堆栈底部的页面
如果“主页”可以位于堆栈中的其他位置,则您可能必须维护自己的页面列表,与导航策略
分开
如果您不想将页面
s保持在主页
和当前页面之间,以下类似的操作可能会起作用:
请注意,您需要创建一个单独的列表
ofPage
以在foreach
循环中的NavigationStack
上调用RemovePage()
来删除,有时会导致异常,类似于“枚举无法完成,集合已更改”的情况:
List pagesToRemove=new List();
foreach(Navigation.NavigationStack中的第页)
{
if(page.GetType()!=typeof(MainPage)&&page!=Navigation.NavigationStack.Last())
{
pagesToRemove.Add(第页);
}
}
//pagesToRemove现在包含当前页面和主页之间的所有页面
foreach(pagesToRemove中的pageToRemove页)
{
导航。删除页面(页面删除);
}
//NavigationStack只包含主页(现在是根目录)和当前页面
//弹出到主页
等待导航。PopAsync();
总有一天,有一个导航到(页面)
或类似的东西会很好,但现在这种方法似乎奏效了
await Navigation.PopAsync();
await Navigation.PopToRootAsync()
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();