(UWP) 硬件后按在移动设备上正常工作,但在 PC 上出错

(UWP) Hardware Back Press work correctly in mobile but error with PC

在我的 UWP 应用程序中,当我单击移动后退按钮应用程序时关闭,因此将此代码添加到 app.xaml.cs

 private async void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
       {

           e.Handled = true;
           Frame rootFrame = Window.Current.Content as Frame;
           if (rootFrame.CanGoBack && rootFrame != null)
           {

               rootFrame.GoBack();
           }
           else
           {
               var msg = new MessageDialog("Confirm Close! \nOr Press Refresh Button to Go Back");
               var okBtn = new UICommand("OK");
               var cancelBtn = new UICommand("Cancel");
               msg.Commands.Add(okBtn);
               msg.Commands.Add(cancelBtn);
               IUICommand result = await msg.ShowAsync();

               if (result != null && result.Label == "OK")
               {
                   Application.Current.Exit();
               }
           }
       }

    public App()
    {            
        this.InitializeComponent();
        this.Suspending += OnSuspending;

    /*  Because of this line my app work on mobile great but when
        when i debug on pc it through exception "show in image" */
        HardwareButtons.BackPressed += HardwareButtons_BackPressed;
    }

当我在 phone 上调试应用程序时完成所有这些代码后,应用程序成功 运行 - 移动调试:

但是当用相同的代码在 pc 上调试时,它显示这个错误- PC 调试:

当我删除 HardwareButtons.BackPressed += HardwareButtons_BackPressed; 时,PC 调试问题已解决,但在移动调试中,后退按钮再次不起作用。

原因是 HardwareButtons API 不是处理后退按钮的通用解决方案。此 API 仅在移动扩展 SDK 中可用,尝试在其他 SKU 上调用它会导致此异常,因为类型不可用。

要在所有系统上启用相同的功能,您将需要使用新的通用后退按钮事件:

SystemNavigationManager.GetForCurrentView().BackRequested += BackButtonHandler;

这在 phone、PC、平板电脑、Xbox One、Surface Hub 和 HoloLens 上同样有效。

在 PC 上默认不显示此按钮,因此您必须手动显示或创建自己的按钮。要在 window 的标题栏中显示后退按钮,请使用:

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

建议您在 Frame.CanGoBack 为 false 时隐藏此按钮,因为在那种情况下该按钮不再有用。您应该在每次导航框架后执行此操作。执行此操作的最佳位置是在 App.xaml.cs:

中设置根框架时
 Frame rootFrame = Window.Current.Content as Frame;
 rootFrame.Navigated += UpdateAppViewBackButton;

现在处理程序可能如下所示:

private void UpdateAppViewBackButton( object sender, NavigationEventArgs e )
{
    Frame frame = (Frame) sender;
    var systemNavigationManager = SystemNavigationManager.GetForCurrentView();
    systemNavigationManager.AppViewBackButtonVisibility =
        frame.CanGoBack ? AppViewBackButtonVisibility.Visible : 
                          AppViewBackButtonVisibility.Collapsed;
}

申请关闭

我还注意到您正在使用 Application.Current.Exit(); 退出应用程序。但是不推荐这样做。一旦用户在对话框中选择确定,您应该设置 e.Handled = false 并让系统手动关闭应用程序。这将确保应用程序暂停将按预期 运行 进行,并且如果系统有足够的资源,应用程序将保留在内存中,然后将再次更快地启动。 Application.Current.Exit() 终止应用程序,不推荐用于 UWP 应用程序。

需要记住的一件事是,在桌面上,目前无法捕捉到用户单击应用程序标题栏中的关闭按钮,因此不幸的是,在这种情况下您的确认对话框将不会显示。