使用 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);
}