Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xamarin在页面之间切换的最佳习惯?_C#_Xamarin_Navigation_Xamarin.forms - Fatal编程技术网

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

C# Xamarin在页面之间切换的最佳习惯?,c#,xamarin,navigation,xamarin.forms,C#,Xamarin,Navigation,Xamarin.forms,我是Xamarin.Forms的新手,我想知道如何切换到“以前加载的”页面 假设我的应用程序运行,并加载(作为第一页)我的MainPage。在那里,我调整了一些按钮/切换(更改状态),然后单击一个按钮,将加载另一个页面(使用导航模型): 现在我想回到上一个MainPage await Navigation.PushAsync(new MainPage()); 但此时,所有内容/按钮状态都消失了(基本上,它创建了一个新的主页) 由于它是后进先出的,我想把它放在内存/堆栈上。如何回忆以前加载的主页

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

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

现在我想回到上一个
MainPage

await Navigation.PushAsync(new MainPage());
但此时,所有内容/按钮状态都消失了(基本上,它创建了一个新的
主页

由于它是后进先出的,我想把它放在内存/堆栈上。如何回忆以前加载的
主页
?或者GC可以在任何时候清洗它,这是否危险

请注意,在这种特定的情况下,这是可行的(因为我只回过一次):


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

需要注意的一点是,您用于推送和弹出的
导航
对象有一个
NavigationStack
属性,您可以使用它来获取以前推送的页面——假设您没有弹出它们

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

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

await Navigation.PopToRootAsync()
返回堆栈底部的
页面

如果“主页”可以位于堆栈中的其他位置,则您可能必须维护自己的
页面列表,与
导航策略
分开

如果您不想将
页面
s保持在
主页
和当前页面之间,以下类似的操作可能会起作用:

请注意,您需要创建一个单独的
列表
of
Page
以在
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();