我是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
,则可能如下所示:
请注意,您需要创建一个单独的Page
List
s,因为调用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)
之类的东西会很好,但现在这种方法似乎有效。