You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 04:45:02