解决Xbox手柄B键触发UWP应用挂起,实现WebView返回导航
解决UWP WebView Xbox手柄B键返回问题
核心问题分析
你遇到的问题根源在于:Xbox手柄B键的系统默认返回主页行为优先级高于自定义的WebView导航逻辑,同时你的代码存在两处关键遗漏:未阻止系统默认动作、WebView实例未正确绑定。
修复步骤
给WebView添加命名引用
修改MainPage.xaml代码,为WebView添加x:Name属性,确保后台代码能正确引用到WebView实例:<WebView x:Name="source" Source="https://luser.github.io/gamepadtest/"> </WebView>阻止B键的系统默认行为
在CoreWindow_KeyDown方法中处理完WebView返回逻辑后,必须设置args.Handled = true,否则系统会继续执行B键的默认返回主页动作:private void CoreWindow_KeyDown(Windows.UI.Core.CoreWindow sender, Windows.UI.Core.KeyEventArgs args) { if(args.VirtualKey == Windows.System.VirtualKey.GamepadB) { if(source.CanGoBack) { source.GoBack(); } // 强制阻止系统处理B键的默认行为 args.Handled = true; } }确保gamepadInputEmulation设置生效
需在WebView加载的页面中正确启用键盘模拟,可通过两种方式实现:- 网页端脚本设置
在目标页面的<script>标签中添加:if (window.navigation) { window.navigation.gamepadInputEmulation = 'keyboard'; } - UWP端代码注入设置
修改XAML中的WebView标签,添加NavigationCompleted事件:
后台实现事件逻辑:<WebView x:Name="source" Source="https://luser.github.io/gamepadtest/" NavigationCompleted="source_NavigationCompleted"> </WebView>private async void source_NavigationCompleted(WebView sender, WebViewNavigationCompletedEventArgs args) { if (args.IsSuccess) { await source.InvokeScriptAsync("eval", new[] { "window.navigation.gamepadInputEmulation = 'keyboard';" }); } }
- 网页端脚本设置
额外优化建议
- 若WebView因焦点丢失导致KeyDown事件未触发,可在
OnNavigatedTo中强制让WebView获取焦点:protected override void OnNavigatedTo(NavigationEventArgs e) { Window.Current.CoreWindow.KeyDown += CoreWindow_KeyDown; source.Focus(FocusState.Programmatic); } - 当WebView无历史页面可返回时,可让B键触发UWP应用内页面返回逻辑:
if(source.CanGoBack) { source.GoBack(); } else { if (Frame.CanGoBack) { Frame.GoBack(); } } args.Handled = true;
内容的提问来源于stack exchange,提问作者Tharun Koti
相关产品推荐
相关产品推荐

