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 应用程序的行为相匹配。这意味着您无需对新应用程序进行任何额外的更改即可支持触摸键盘.