后退按钮 运行 Amok

Back Button Running Amok

在我的每个应用程序页面上,我都设置了后退按钮的功能,因为我希望它每次都执行不同的操作。但是,当我在一页上 运行 时:

SystemNavigationManager.GetForCurrentView().BackRequested += (s, a) =>
{
    Frame.Navigate(typeof(MainPage));
    a.Handled = true;
};

它还运行我的另一个页面上的后退按钮的功能如果该页面首先被访问过。这会引发异常,因为它试图卸载一个不存在的项目。这不是设置每页后退按钮功能的正确方法吗?

这是正确的行为,因为 SystemNavigationManager.GetForCurrentView() returns 与 SystemNavigationManager 相同,因为它仍然是相同的视图(不是页面!),然后您有两个事件处理程序附加到事件.

如果您希望每个页面都有特定的事件处理程序,请使用 OnNavigatedTo 添加和 OnNavigatedFrom 删除事件处理程序:

public class BackButtonPage : Page
{
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        BackButtonVisibility = base.Frame.CanGoBack ? AppViewBackButtonVisibility.Visible : AppViewBackButtonVisibility.Collapsed;

        SystemNavigationManager.GetForCurrentView().BackRequested += BackButtonPage_BackRequested;

        base.OnNavigatedTo(e);
    }

    protected override void OnNavigatedFrom(NavigationEventArgs e)
    {
        base.OnNavigatedFrom(e);

        SystemNavigationManager.GetForCurrentView().BackRequested -= BackButtonPage_BackRequested;
    }

    private void BackButtonPage_BackRequested(object sender, BackRequestedEventArgs e)
    {
        OnBackRequested(sender, e);
    }

    protected virtual void OnBackRequested(object sender, BackRequestedEventArgs e)
    {
        //your page specific code here
        Frame.Navigate(typeof(MainPage));
        e.Handled = true;
    }

    public AppViewBackButtonVisibility BackButtonVisibility
    {
        get { return SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility; }
        set { SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = value; }
    }
}

(source from Microsoft's examples on github)