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