触摸键盘概述
本白皮书提供有关 Windows 操作系统触摸键盘的调用和解除行为的信息。还为开发人员提供了解触摸键盘如何显示和隐藏的指南。
该信息适用于以下操作系统:
- Windows 8
- Windows Server 2012
免责声明:本文档按原样提供。本文档中表示的信息和视图(包括 URL 和其他 Internet 网站引用)如有更改,恕不另行通知。使用本文档的风险由你自己承担。
本文档不向你提供任何 Microsoft 产品中任何知识产权的任何合法权利。你可以复制和使用本文档作为内部参考之用。
©2012 Microsoft。保留所有权利。
概述
Windows 8 触摸键盘是一个允许使用触摸设置输入文本的系统组件。当用户希望输入文本时显示触摸屏幕,当用户不希望输入文本时触摸键盘消失。设计调用和解除模型的目的是确保此预期在系统中以一致的方式应用,而与用户在任何特定时间使用什么应用无关。触摸键盘对定义丰富的 UI 辅助功能属性作出反应意味着要确定焦点 UI 元素是否用于接收文本输入。除了鼓励良好的辅助功能做法之外,该方法还允许触摸键盘为根位于用户将交互的 UI 元素中的调用和解除定义一组特定的规则。
在沉浸式环境中,触摸键盘的调用和解除行为是由三个输入驱动的:
- Microsoft UI 自动化 (UIA) 中的辅助功能属性
- 用户点击
- 焦点更改
UI 自动化是一种机制,开发人员通过该机制交流特定的 UI 元素是否可以接收文本输入。你必须确保在你的应用中设置相应的辅助功能属性,以便触摸键盘知道当焦点位于特定 UI 元素上时显示。对于 Windows 提供的控件,会自动进行该操作,因为默认情况下系统会设置正确的辅助功能属性,但对于自定义控件和体验,你必须进行一些附加工作来正确设置辅助功能属性;请记住,触摸键盘会对这些属性作出反应。当用户触摸具有焦点的输入字段时显示该键盘。如果各个应用通过编程方式设置焦点,则该操作不会调用触摸键盘。这是因为用户从不会因为出现该键盘而感到吃惊。该键盘会自动隐藏以响应编程焦点改变,但是如果用户已完成某个文本输入流以及应用已将焦点移到其他位置,那么该键盘会消失。
调用和解除逻辑
触摸键盘利用 UIA 作为确定具有焦点的 UI 元素是否用于文本输入的一种预先存在且定义明确的方式,并且如果该键盘之前已隐藏,则应该导致该键盘出现。还可以使用 UIA 来确定具有焦点的 UI 元素是否不应通过触摸键盘进行交互,因此,如果该键盘未显示,则会解除该键盘。UIA 直接通过用于可扩展应用标记语言 (XAML) 的 Microsoft .NET 显示并且可以通过 WWAHost.exe 的可访问的丰富 Internet 应用 (ARIA) 访问。Windows 为开发人员提供的常用控件已设置相应的 UIA 属性,但具有自定义控件的开发人员需要直接设置辅助功能属性。在任何特定的时间,触摸键盘都可以处于两个状态之一:显示或隐藏。而且,当任何给定的焦点更改时,Windows 可以更改键盘的可见性状态或使其保持不变。
触摸键盘通过以下方法确定具有焦点的 UI 元素是否用于文本输入:查看该键盘是否拥有 UIA TextPattern(或 TextChildPattern)控件模式以及是否可编辑。如果具有焦点的元素无法满足这些条件中的任何一个条件,则触摸键盘不会显示,但如果已显示,则隐藏该键盘。
还有一组控件可以在文本输入流期间接收焦点,但不可编辑(组合框除外,因为组合框是编辑字段和列表的组合,焦点在这两个之间移动)。触摸键盘仍然位于控件的视图中(而不会对 UI 进行不必要的改动,也不会在流中间对用户造成迷惑),因为用户可能会在控件和使用触摸键盘的文本输入之间来回切换。因此,如果键盘已显示并且焦点位于以下列表中其中一种类型的控件上,则该键盘不会隐藏。但是,如果该键盘尚未显示,那么除非在可编辑区域点击,否则不会显示该键盘。 例如,假设一个用户正在某个使用应用栏托管其文本编辑控件(如粗体和斜体)的应用中键入电子邮件消息,该用户希望使下面的文字成为粗体,因此点击了“粗体”按钮。由于菜单栏位于存在触摸键盘的控件列表上,因此即使用户在输入字段之外点击,该键盘也不会隐藏。这种行为允许用户立即返回进行键入操作。
所讨论的控件如下:
- 复选框
- 组合框
- 单选按钮
- 滚动条
- 树
- 树项目
- 菜单
- 菜单栏
- 菜单项目
- 工具栏
- 列表
- 列表项目
设置正确的辅助功能属性
提醒:仅当你使用自定义控件时,本部分才有意义。Windows 提供的常用控件不需要进行其他任何工作就能够通过触摸键盘正常工作。
如果你是一名正在使用自定义控件的应用开发人员,则确保该控件具有正确的辅助功能信息才能获取触摸键盘行为。 执行该操作之后,将按照预期的用户模型来显示和隐藏该键盘。
在 HTML5 中,在控件上设置正确的 ARIA 属性是一件非常简单的事:role="textbox"
。当然,该控件还必须可编辑,因此还建议设置contentEditable="true"
。例如,下面创建了一个内容可编辑的 div,当用户点击它时将调用触摸键盘。
<div contentEditable="true" role="textbox">
如果你使用的是 C# 或 C++,则应使用 AutomationPeer 对象,具体来说就是 TextAutomationPeer。Windows 8 示例将演示如何使用 C# 执行该操作。
请记住,除了拥有正确的辅助功能设置之外,该控件必须还可编辑并且能够接收文本以调用该键盘。无法接收文本时指示某些内容可以接收文本将误导辅助功能工具以及依赖它们的用户。
用户驱动的调用
触摸键盘的调用模型设计为由用户来控制该键盘。用户通过在输入控件上点击来指示系统他们想输入文本,而不是让应用代表他们作出决定。这样便没有了意外调用该键盘的可能性,由于该键盘占用多达 50% 的屏幕,因此改动 UI 将非常痛苦并且会损害应用的用户体验。为了支持用户驱动的调用,我们跟踪上一个触摸事件的坐标并将其与当前具有焦点的元素边界矩形的位置相比较。如果该点包含在边界矩形之内,则调用触摸键盘。
这意味着应用无法采用编程方式通过操作焦点来调用触摸键盘。过去此处最大的问题就是网页—很多网页默认情况下将焦点设置在输入字段中,但页面上有很多其他体验可供用户享受。最好的例子就是 msn.com。该网站具有很多可以使用的内容,但刚好其页面顶部有一个 Bing 搜索栏,该搜索栏默认情况下获得焦点。如果自动调用该键盘,则默认情况下将遮挡搜索栏下面的所有文章,因此会破坏该网站在平板电脑上的体验。必须点击才能获得该键盘,有时感觉不是很好,例如当用户已启动一个新的电子邮件或已打开“搜索”窗格时。但是,我们感觉需要用户点击输入字段还是可以接受的。
本文引用
http://www.devdiv.com/触摸键盘-thread-132896-1-1.html
http://msdn.microsoft.com/en-us/library/windows/apps/hh465404.aspx