Windows 10环境下WPF应用触摸键盘遮挡UI元素解决方案咨询
解决方案
实现逻辑
Windows 10 系统的触摸键盘(软输入面板)弹出/收起时,会通过WinRT的InputPane类抛出对应事件,我们可以监听该事件获取键盘的高度,动态调整主窗口的尺寸与位置,保证输入控件始终位于可视区域内。
具体实现步骤
- 首先修改项目目标框架,确保支持WinRT API调用:打开项目文件(.csproj),将TargetFramework修改为适配Windows 10的版本,示例如下:
<TargetFramework>net5.0-windows10.0.19041.0</TargetFramework> <TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion>
- 在MainWindow的后台代码中添加事件监听与处理逻辑:
using Windows.UI.ViewManagement; using System.Windows; namespace App1234.Views { public partial class MainWindow : Window { private InputPane _inputPane; private double _originalWindowHeight; private double _originalWindowTop; public MainWindow() { InitializeComponent(); } private void MainWindow_OnLoaded(object sender, RoutedEventArgs e) { // 获取当前窗口对应的InputPane实例 _inputPane = InputPane.GetForCurrentView(); // 注册键盘显示/隐藏事件 _inputPane.Showing += InputPane_Showing; _inputPane.Hiding += InputPane_Hiding; // 记录窗口原始高度与位置 _originalWindowHeight = this.Height; _originalWindowTop = this.Top; } private void InputPane_Showing(InputPane sender, InputPaneShowingEventArgs args) { // 获取触摸键盘的高度 double keyboardHeight = args.OccludedRect.Height; // 调整窗口高度,让窗口底部刚好位于键盘顶部 this.Height = _originalWindowHeight - keyboardHeight; // 可选:如果窗口位置偏下,可调整Top值上移窗口避免顶部超出屏幕 // this.Top = Math.Max(0, _originalWindowTop - keyboardHeight); } private void InputPane_Hiding(InputPane sender, InputPaneHidingEventArgs args) { // 键盘收起时恢复窗口原始高度与位置 this.Height = _originalWindowHeight; this.Top = _originalWindowTop; } // 窗口关闭时注销事件避免内存泄漏 protected override void OnClosed(EventArgs e) { base.OnClosed(e); if (_inputPane != null) { _inputPane.Showing -= InputPane_Showing; _inputPane.Hiding -= InputPane_Hiding; } } } }
特殊情况处理
如果你的应用之前配置了不带uiAccess标识的管理员权限启动,上述WinRT API会因权限限制无法正常触发事件,需要取消管理员权限要求:
打开项目的app.manifest文件,将requestedExecutionLevel节点修改为如下配置:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

