我是Xamarin.Forms
的新人,我想知道如何切换到先前加载的""页。
让我说我的应用程序运行,并加载(作为第一页)我的MainPage
。在那里我调整一些按钮/切换(更改状态),然后点击一个将加载另一个页面的按钮(使用Navigation
模型):
await Navigation.PushAsync(new MyNewPage());
现在我想回到之前的MainPage
await Navigation.PushAsync(new MainPage());
但此时,所有内容/按钮状态都消失了(基本上它会创建一个新的MainPage
)。
由于它是一个LIFO,我的方面是它在内存/堆栈上。如何回忆以前加载的MainPage
?或者它是危险的,因为GC可以在任何时候清理它?
请注意,在这种特定情况下,这将起作用(因为我只回来一次):
await Navigation.PopAsync();
但是我想使用一个有选择性的approch(在我所在的位置调用我需要的东西,学习整个概念)。
答案 0 :(得分:1)
需要注意的一点是,用于推送和弹出的Navigation
对象具有NavigationStack
属性,可用于获取以前推送的页面 - 假设您没有弹出它们。
据我所知,没有任何方法可以直接导航到堆栈中的现有Page
,因此您可能需要在方法上有所创新。
如果MainPage
始终位于NavigationStack
的底部,则可以使用
await Navigation.PopToRootAsync()
返回堆栈底部的Page
。
如果' MainPage'可以在堆栈的其他位置,您可能必须维护自己的Page
列表,与NavigationStack
分开。
如果您不关心将Page
保持在MainPage
与当前页面之间,则以下内容可能会有效:
请注意,您需要创建单独的List
Page
个RemovePage()
来删除,因为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}}之类的东西会很不错,但现在这种方法似乎有效。