使用 Frame.Navigate 时如何实现正确的返回行为?
How to implement correct Back behaviour when using Frame.Navigate?
我有一个 Windows 10 Universal Windows 平台应用程序,它有多个页面、一个主页、一个列表页面和一个详细信息页面,并使用以下内容导航到列表页面:
this.Frame.Navigate(typeof(ListPage), parameter);
当您在列表页面上时,您可以 select 将启动详细信息页面的项目,如下所示:
this.Frame.Navigate(typeof(DetailsPage), parameter);
效果很好,参数是 selected Id 或信息,然后在使用桌面应用程序或 Phone 上的后退按钮时使用:
this.Frame.GoBack();
这总是 returns 到 MainPage,即从 Main 转到 List 到 Details 时返回到 Main,我如何让 GoBack 返回到上一页,似乎总是回家而不是用户预期的行为,如何解决这个问题?
我之前在页面上订阅 HardwareButtons.BackPressed 事件(或 Win10 UWP 应用程序中的任何等效事件)时看到过这种情况,但不要取消订阅。这意味着在按下返回时会调用两个事件处理程序,并且两个事件处理程序都会调用 Frame.GoBack().
我总是在页面的NavigatedTo事件中订阅事件,在NavigatedFrom事件中取消订阅。
您的应用会出现这种情况吗?
如果您应用中的每个页面都应具有相同的行为,即返回上一页,则按照@RoguePlanetoid 在评论中的建议订阅应用中的后退按钮事件class:
SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested;
OnLaunched 方法是执行此操作的好地方。当应用程序在台式机或平板电脑上 运行 时,不要忘记告诉 OS 显示后退按钮:
SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;
然后,在应用程序中添加事件处理程序 class,如下所示:
private void OnBackRequested(object sender, BackRequestedEventArgs e)
{
Frame rootFrame = Window.Current.Content as Frame;
if (rootFrame.CanGoBack)
{
e.Handled = true;
rootFrame.GoBack();
}
}
如果您希望在按下后退时在不同的页面上有不同的行为,即要求用户确认丢失他们的更改或其他东西,然后在页面 OnNavigatedTo 方法中订阅后退按钮事件(代码与上面相同),但请确保您在页面的 OnNavigatedFrom 事件中取消订阅:
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
SystemNavigationManager.GetForCurrentView().BackRequested -= this.OnBackPressed;
base.OnNavigatedFrom(e);
}
我有一个 Windows 10 Universal Windows 平台应用程序,它有多个页面、一个主页、一个列表页面和一个详细信息页面,并使用以下内容导航到列表页面:
this.Frame.Navigate(typeof(ListPage), parameter);
当您在列表页面上时,您可以 select 将启动详细信息页面的项目,如下所示:
this.Frame.Navigate(typeof(DetailsPage), parameter);
效果很好,参数是 selected Id 或信息,然后在使用桌面应用程序或 Phone 上的后退按钮时使用:
this.Frame.GoBack();
这总是 returns 到 MainPage,即从 Main 转到 List 到 Details 时返回到 Main,我如何让 GoBack 返回到上一页,似乎总是回家而不是用户预期的行为,如何解决这个问题?
我之前在页面上订阅 HardwareButtons.BackPressed 事件(或 Win10 UWP 应用程序中的任何等效事件)时看到过这种情况,但不要取消订阅。这意味着在按下返回时会调用两个事件处理程序,并且两个事件处理程序都会调用 Frame.GoBack().
我总是在页面的NavigatedTo事件中订阅事件,在NavigatedFrom事件中取消订阅。
您的应用会出现这种情况吗?
如果您应用中的每个页面都应具有相同的行为,即返回上一页,则按照@RoguePlanetoid 在评论中的建议订阅应用中的后退按钮事件class:
SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested;
OnLaunched 方法是执行此操作的好地方。当应用程序在台式机或平板电脑上 运行 时,不要忘记告诉 OS 显示后退按钮:
SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;
然后,在应用程序中添加事件处理程序 class,如下所示:
private void OnBackRequested(object sender, BackRequestedEventArgs e)
{
Frame rootFrame = Window.Current.Content as Frame;
if (rootFrame.CanGoBack)
{
e.Handled = true;
rootFrame.GoBack();
}
}
如果您希望在按下后退时在不同的页面上有不同的行为,即要求用户确认丢失他们的更改或其他东西,然后在页面 OnNavigatedTo 方法中订阅后退按钮事件(代码与上面相同),但请确保您在页面的 OnNavigatedFrom 事件中取消订阅:
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
SystemNavigationManager.GetForCurrentView().BackRequested -= this.OnBackPressed;
base.OnNavigatedFrom(e);
}