如果必须,我会在导航到页面时将 arg 传递给页面,但是否有必要 - 有没有办法知道哪个页面称为 Navigate() 而无需这样做?
3 回答
在 Application 对象中保留一个名为 PreviousPage 的静态属性。在每个页面(或在基类中)的 OnNavigatedFrom 事件中,将 PreviousPage 设置为“this”(当前页面)。在 OnNavigatedTo 事件中,您可以检查 Application.PreviousPage 属性并按照您认为合适的方式使用它。这是访问前一页的最有效方式,因为 Windows 应用商店应用程序的框架中没有 Frame.BackStack 属性。
您可以使用GetNavigationState
,但它有一些不良的副作用(它导航离开当前页面并且字符串是内部的,不保证它可能/可能不会改变)。我认为你最好通过它。
调用此方法将使用 NavigationMode.Forward 为当前页面调用 Page.OnNavigatedFrom。GetNavigationState 通常在应用程序被挂起时调用,因此当前页面被导航离开。
笔记:
这些方法使用的序列化格式仅供内部使用。您的应用程序不应对其形成任何依赖关系。此外,此格式仅支持基本类型(如字符串、字符、数字和 GUID 类型)的序列化。
我遇到了这个确切的问题,Caleb 的回答非常有帮助。我只是想发布一些代码来阐明我如何使用他的解决方案。
免责声明我对 C# 有点(非常!)新手,我确信有更好的方法可以做到这一点,但我想提供它作为起点,以防其他人正在寻找更多细节。
我在应用程序的命名空间中创建了一个全局变量来保存上一页状态:
public static class global_vals{
static object _previousPage;
public static object previousPage
{
get
{
return _previousPage;
}
set
{
_previousPage = value;
}
}
}
我每个页面上的 OnNavigatedFrom 方法如下所示:
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
global_vals.previousPage = this;
}
OnNavigatedTo 方法检查全局变量,如下所示:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (global_vals.previousPage.GetType().ToString() == "AppName.SomePage")
{
//do something
}
}