Windows Presentation Foundation (WPF) 应用程序在支持触控的世界中会遇到一些困难。在 WinRT 应用程序中,当文本字段获得焦点时,触摸键盘会自动显示,这样用户就可以在不需要经典键盘的情况下键入(不会中断她的触摸工作流程)。对于经典桌面应用程序,情况有所不同——文本框不会导致触摸键盘出现,用户必须手动打开它。这显然非常麻烦。

嘿!如何让您访问我的 WPF 应用程序?

此问题有两种不同的解决方法。

hack-y 方式

第一个解决方案是相当多的黑客攻击。这要求我们关闭对 WPF 应用程序的墨迹支持,并实际强制系统以正确的方式运行。您将需要一些 COM 导入并调用本机 Windows API。这个过程在 Brian Lagunas 的博客上有很好的描述 ,我鼓励你尝试一下。如果它对你有用,那就太好了!

我发现这个解决方案的缺点是它会 干扰 ListBox 控件的触摸“平移”。任何尝试进行触摸平移只会触发悬停项目上的 ItemClick 事件,并且用户需要使用小滚动条进行滚动,这非常不方便。

简单但更手动的方法

为了克服在 WPF 应用程序中禁用墨迹支持后出现的问题,我们可以采用更简单但自动化程度较低的解决方案。我们将扩展 TextBox 控件并在它获得触摸焦点时更改其行为。

public class TouchEnabledTextBox : TextBox
{public TouchEnabledTextBox(){this.GotTouchCapture += TouchEnabledTextBox_GotTouchCapture;}private void TouchEnabledTextBox_GotTouchCapture(object sender, System.Windows.Input.TouchEventArgs e){string touchKeyboardPath = @"C:\Program Files\Common Files\Microsoft Shared\Ink\TabTip.exe";        Process.Start( touchKeyboardPath );}
}

那么这是如何工作的呢?

当用户通过触摸输入 TextBox 后获得焦点时,将调用GotTouchCapture事件。在这种情况下,我们可以手动启动触摸键盘的过程。触摸键盘只是一个经典的桌面应用程序,位于 “C:\Program Files\Common Files\Microsoft Shared\Ink\TabTip.exe”路径中。

这个解决方案非常简单,本身不需要任何“黑客攻击”。唯一的缺点是,作为开发人员,您必须确保每次需要获得正确的基于触摸的行为时都使用此修改版本的 TextBox 控件。

杀死进程

对此的逻辑扩展是在不再需要时终止触摸键盘进程——输入失去焦点。Process.Start (string) 方法返回一个Process类的实例,该实例提供了一个Kill()方法,该方法将在调用时终止进程。

首先,我们需要将流程实例存储在 TextBox 的私有字段中:

//inside the class definition
private Process _touchKeyboardProcess = null;//replace Process.Start line from the previous listing with
_touchKeyboardProcess = Process.Start( touchKeyboardPath );

现在我们连接LostFocus 事件:

//add this at the end of TouchEnabledTextBox's constructor
this.LostFocus += TouchEnabledTextBox_LostFocus;//add this method as a member method of the class
private void TouchEnabledTextBox_LostFocus( object sender, RoutedEventArgs eventArgs ){if ( _touchKeyboardProcess != null ) {_touchKeyboardProcess.Kill();//nullify the instance pointing to the now-invalid process_touchKeyboardProcess = null;}
}

更新 – Windows 10 方式

在 Windows 10 中,由于新的平板电脑模式和设置,这变得不再是一个问题。

平板模式

最新版本的 Windows 带来了一种称为平板电脑模式的新模式,该模式可以通过操作中心或设置应用程序打开,并且针对触控优先使用进行了优化。虽然有些人认为它的工作方式是对 Windows 8.1 的降级,但它提供了新的 Windows 应用商店应用程序和经典桌面应用程序的更直观的集成。每个应用程序默认为全屏,同时保留两个应用程序的多任务选项并排。打开平板电脑模式的另一个好处是每次任何文本字段获得焦点时都会自动触发触摸键盘,无论应用程序类型如何。这消除了手动启动触摸键盘的需要,让操作系统控制并确保一切都得到正确处理。与现代应用程序相比,唯一的缺点是键盘不会移动也不会调整应用程序窗口的大小并覆盖它(即使它固定在屏幕底部)。这意味着,某些内容可能会变得不可见(例如工具提示或上下文菜单)。

在平板电脑模式之外

但是,当您出于某种原因不想打开平板电脑模式但仍想享受操作系统对文本输入的自动处理时,该怎么办?一个不起眼的设置可以使这种情况发生!

打开“设置”应用,进入“设备”类别并选择“输入”  ——在此处向下滚动,您将看到默认关闭的设置(出于某种原因,我真的不明白为什么)——以显示触摸键盘以防万一在没有连接键盘的情况下输入。这是大多数情况下的完美解决方案,使使用所有带有触摸功能的应用程序获得非常愉快和一致的体验。

更新 – .NET Framework 4.6.2

2016 年 8 月,Microsoft 宣布了 .NET Framework 4.6.2 的新更新。除了为 WPF 添加了非常有用的Per-Monitor DPI之外,此更新还解决了触摸键盘的问题。

针对新版框架的 WPF 应用程序支持触摸键盘的自动调用和解除,与 Windows 10 上的 UWP 应用程序的行为相匹配。这意味着您无需对新应用程序进行任何额外的更改即可支持触摸键盘.

如何在与 WPF 文本框的触摸交互中显示触摸键盘相关推荐

  1. WPF 文本框添加水印效果

    有的时候我们需要为我们的WPF文本框TextBox控件添加一个显示水印的效果来增强用户体验,比如登陆的时候提示输入用户名,输入密码等情形.如下图所示: 这个时候我们除了可以修改TextBox控件的控件 ...

  2. 电子邮件地址验证:详细解释,生产质量WPF文本框代码

    目录 介绍 电邮地址格式 1. Address 2. addr-spec 有效的电子邮件地址 显示名称 注释 引号 一些看起来很奇怪的有效地址 Domain-Part要求 不使用ASCII字符(UTF ...

  3. Wpf 文本框模糊匹配

    Wpf 文本框模糊匹配 源码下载地址 实现效果如图 整体实现不怎么难就不一一介绍了,主要是用了Popup 以及keyup 事件 这里有一个问题是style 中绑定属性不能直接用(这个地方我准备有时间了 ...

  4. tableView cell 中如果有文本框点击自动滚动不被键盘挡住

    tableView cell 中如果有文本框点击自动滚动不被键盘挡住 tableView 是继承UIscrollView,所以自然有setContentOffset方法,该方法可以设置tableVie ...

  5. python作业.创建两个文本框,一个按钮。第 1 个文本框绑定任意键事件,敲击键盘任意可显示字符,在交互窗口中显示该字符;第 2 个文本框绑定<a>键事件,敲击键盘 a 字符,在交互窗口中显示 10

    """ 创建两个文本框,一个按钮. 第 1 个文本框绑定任意键事件,敲击键盘任意可显示字符,在交互窗口中显示该字符: 第 2 个文本框绑定<a>键事件,敲击键 ...

  6. 创建两个文本框,一个按钮。第 1 个文本框绑定任意键事件,敲击键盘任意可显示字符,在交互窗口中显示该字符;

    创建两个文本框,一个按钮.第 1 个文本框绑定任意键事件,敲击键盘任意可显示字符,在交互窗口中显示该字符:第 2 个文本框绑定键事件,敲击键盘 a 字符,在交互窗口中显示 10 个'a'字符:按钮绑定 ...

  7. 泛微OA 子表单中文本框设置默认值不显示的问题

    2021年5月18日 截止以上日期,子表单可能存在bug,解决方式: 这个不显示默认值的文本框(比如叫默认值文本框),必须设置显示条件: 1.如果没有条件,创造一个:在任意位置添加一个文本框(用户ID ...

  8. wpf文本框限制输入长度_Excel办公实操,限制输入日期,手机号码,不重复数据的使用...

    限制只能输入当前日期之前的日期 图是某企业的入库登记表,用来登记不同日期各品名和型号的入库信息.其中A列是产品入库的日期,要求必须为当前日期之前的日期,为了防止工作人员将入库日期输入为当天以后的日期, ...

  9. html 点击空白关闭浮层,js中点击空白区域时文本框与隐藏层的显示与影藏问题...

    当文本框获得焦点的时候,在文本框的下方显示一个浮动层. 当用户点击除了文本框和浮动层以外的网页空白处时,要隐藏浮动层. 当用户点击浮动层时,改变文本框的值. function $(id){ retur ...

最新文章

  1. Direct2D (15) : 剪辑
  2. hive查询where join_Hive系列(4):常用函数where,join
  3. Linux_指令杂烩
  4. 微信翻译生日快乐的代码_微信「隐藏彩蛋」,你发现了没?
  5. SSH无密码登录:只需两个简单步骤 (Linux)
  6. 设计模式:中介者模式(Mediator)
  7. 使用showMessageDialog显示消息框
  8. java hibernate dto_java – 正确使用Entity和DTO在Restful Web服务中...
  9. php标准库string,PHP中的一些标准库
  10. mysql如何导出word_SQL导出为Word
  11. 301永久重定向实现方式及302重定向(侧重.htaccess)
  12. dex2jar 和 jd-gui 的安装与使用
  13. 截取安卓直播APP中的视频流 -央视频或者斗鱼直播下载+
  14. 员工管理能力怎么提高?不妨使用现代工时表软件
  15. 怎么把ppt文字大小设置一致_我与PPT营销力的“恋爱”只有进行时没有完成时
  16. 虚拟文件系统VSF的作用
  17. 时域信号处理——时域采样(抽样)
  18. 计算机软件树状图,树状图怎么画|画树状图步骤
  19. python3通过request多进程获取驾校一点通试题库
  20. kettle carte服务配置

热门文章

  1. 劈裂天线在无线网建设中的应用
  2. 您必须了解的4种OpenStack Neutron网络类型
  3. 信道复用技术之码分复用
  4. idea中创建jsp项目
  5. 往年计算机等级考试一级b 的试题,计算机一级考试往年真题
  6. CH1055:一种近红外NIR-II成像的小分子染料(荧光基团优于ICG)
  7. PCB入门学习— CHIP类PCB封装的创建
  8. 今天推荐几款好用的网站
  9. Altium Designer 放置圆形禁止覆铜区
  10. php中退出的时候弹框显示,php – 浏览器关闭时显示弹出窗口