WPF 禁用TextBox的触摸后自动弹出虚拟键盘

本文介绍如何在WPF应用中禁用TextBox控件点击后自动弹出的虚拟键盘。通过重写TextBox的OnCreateAutomationPeer方法,返回UIElementAutomationPeer而非AutomationPeer,从而阻止虚拟键盘的自动弹出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文: WPF 禁用TextBox的触摸后自动弹出虚拟键盘

前言 & 问题

如下截图,TextBox,在触摸点击后,会自动弹出windows的虚拟键盘。

如何,禁用键盘的自动弹出?

调用虚拟键盘

通过调用TapTip.exe或者osk.exe,主动弹出虚拟键盘

详细调用可参考:c#调用windows虚拟键盘

如何禁用键盘的弹出

TextBox在触摸点击后,会自动弹出虚拟键盘,是因为在控件中作了封装。

--TextBox中详细TabTip.exe封装看了会,没找到

处理方案:重写TextBox的方法OnCreateAutomationPeer,返回一个UIElementAutomationPeer而不是AutomationPeer。

可能原因:TextBox自定义实现中返回的是AutomationPeer,而UIElementAutomationPeer继承AutomationPeer,重写了相关键盘属性。

猜测与HasKeyboardFocusCore属性有关。

直接复制如下代码:

 1     /// <summary>
 2     /// 禁用自动弹出虚拟键盘的TextBox控件
 3     /// </summary>
 4     public class TextBoxNoAutoKeyboard : TextBox
 5     {
 6         protected override AutomationPeer OnCreateAutomationPeer()
 7         {
 8             return new FrameworkElementAutomationPeer(this);
 9         }
10     }

 以上参考自:【stackoverflow】“Hide” text box from automatic Win10 keyboard showing

在Windows Presentation Foundation (WPF)中,实现文本框(TextBox)点击后弹出虚拟键盘,并在用户完成输入后自动关闭,通常需要结合`TextBox`、`Popup`控件以及一些自定义的输入处理。以下是基本步骤: 1. 首先,在XAML中设置`TextBox`的`GotFocus`事件处理器,当TextBox获得焦点时打开虚拟键盘: ```xml <TextBox x:Name="txtInput" GotFocus="txtInput_GotFocus"/> ``` 2. 创建`Popup`并设置其内容为键盘视图。你可以创建一个自定义的UIElement或者使用现成的第三方库,如Mahapps.Metro的虚拟键盘控件。 ```xaml <Popup IsOpen="{Binding IsKeyboardOpen}" PlacementTarget="{Binding ElementName=txtInput}"> <custom:VirtualKeyboard/> </Popup> ``` 这里假设`custom:VirtualKeyboard`是你自定义的虚拟键盘UserControl名。 3. 在`ViewModel`或`Code Behind`里绑定`IsOpen`属性和添加必要的逻辑: ```csharp public class ViewModel : INotifyPropertyChanged { private bool isKeyboardOpen = false; public bool IsKeyboardOpen { get { return isKeyboardOpen; } set { if (value != isKeyboardOpen) { isKeyboardOpen = value; OnPropertyChanged("IsKeyboardOpen"); } } } // 其他方法... private void txtInput_GotFocus(object sender, RoutedEventArgs e) { IsKeyboardOpen = true; } private void txtInput_LostFocus(object sender, RoutedEventArgs e) { IsKeyboardOpen = false; } } ``` 4. 当`LostFocus`事件触发时(比如用户离开TextBox),关闭虚拟键盘: ```csharp private void txtInput_LostFocus(object sender, RoutedEventArgs e) { IsKeyboardOpen = false; // 关闭虚拟键盘 } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值