使用Frame.Navigate时如何实现正确的Back行为?

时间:2015-07-15 09:12:11

标签: xaml navigation windows-10 win-universal-app

我有一个Windows 10通用Windows平台应用程序,包含多个页面,主页面,列表页面和详细信息页面,并使用以下内容导航到列表页面:

this.Frame.Navigate(typeof(ListPage), parameter);

当您在列表页面上时,您可以选择一个项目,该项目将启动详细信息页面,如下所示:

this.Frame.Navigate(typeof(DetailsPage), parameter);

哪个工作正常,参数是选定的ID或信息,然后使用桌面应用或手机上的后退按钮时使用:

this.Frame.GoBack();

这总是返回到MainPage,即从Main进入,List到Details返回Main,如何让GoBack回到上一页,它似乎总是回家而不是用户期望的行为,一个想法如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

在您订阅页面上的HardwareButtons.BackPressed事件(或Win10 UWP应用程序中的等效事件)之前,我已经看到了这一点,但之后不要取消订阅。这意味着在按Back时会调用两个事件处理程序,并且两个事件处理程序都调用Frame.GoBack()。

我总是在页面的NavigatedTo事件中订阅该事件,并在NavigatedFrom事件中取消订阅。

你的应用程序会发生这种情况吗?

如果您应用中的每个页面都应具有相同的行为,即返回上一页,请按照@RoguePlanetoid在评论中的建议订阅应用类中的后退按钮事件:

SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested;

OnLaunched方法将是一个很好的地方。当应用程序在台式机或平板电脑上运行时,不要忘记告诉操作系统显示后退按钮:

SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;

然后,在app类中添加一个事件处理程序,如下所示:

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