创建可访问的应用程序具有重要的业务意义。 许多政府都有软件购买的无障碍法规。 Windows 认证徽标包括辅助功能要求。 据估计,仅美国就有3000万居民,其中许多是潜在客户,受到软件可访问性的影响。
本演练将介绍获得 Windows 认证徽标的五项可访问性要求。 根据这些要求,可访问的应用程序将:
支持控制面板大小、颜色、字体和输入设置。 当用户更改控制面板设置时,菜单栏、标题栏、边框和状态栏都将自行调整大小。 此应用程序中不需要对控件或代码进行其他更改。
支持高对比度模式。
提供对所有功能的记录键盘访问权限。
以可视方式和以编程方式公开键盘焦点的位置。
避免仅通过声音传达重要信息。
有关详细信息,请参阅 用于设计辅助应用程序的资源。
有关支持不同键盘布局的信息,请参阅 开发世界就绪应用程序的最佳做法。
创建项目
本教程为一个接受披萨订单的应用程序创建用户界面。 它由TextBox客户姓名、一个RadioButton用于选择披萨大小的组、一个CheckedListBox用于选择配料、标记为“订单”和“取消”的两个按钮控件,以及一个带有退出命令的菜单组成。
用户输入客户的姓名、披萨的大小和所需的配料。 当用户单击“订单”按钮时,订单总览及其成本会显示在消息框中,控件会被重置并准备好下一个订单。 当用户单击“取消”按钮时,控件将清除并准备好下一个订单。 当用户单击“退出”菜单项时,程序将关闭。
本演练的重点不是零售订单系统的代码,而是用户界面的可访问性。 该演示教程展示了多个常用控件的无障碍功能,包括按钮、单选按钮、文本框和标签。
开始创建应用程序
- 在 Visual Basic 或 Visual C# 中创建新的 Windows 应用程序。 将项目命名 为 PizzaOrder。 有关详细信息,请参阅 “创建新解决方案和项目”。
在窗体上添加控件
在将控件添加到窗体时,请记住以下指南,以便应用程序具有更好的可访问性:
设置 AccessibleDescription 和 AccessibleName 属性。 在此示例中,默认设置 AccessibleRole 已足够。 有关辅助功能属性的详细信息,请参阅 为 Windows 窗体上的控件提供辅助功能信息。
将字号设置为 10 点或更大。
注释
如果在开始时将窗体的字号设置为 10,则随后添加到窗体的所有控件的字号将为 10。
确保描述 TextBox 控件的任何标签控件紧跟在 Tab 键顺序中的 TextBox 控件之前。
使用“&”字符将访问密钥添加到用户可能需要导航到的任何控件的
属性。 使用“&”字符将访问键添加到位于用户可能需要导航到的控件之前的标签属性中。 将标签 UseMnemonic 的属性设置为
true
,以便在用户按下访问键时将焦点设置为 Tab 键顺序中的下一个控件。向所有菜单项添加访问键。
使 Windows 应用程序易于访问
将控件添加到窗体并设置属性,如下所示。 有关如何在窗体上排列控件的模型,请参阅表格末尾的图片。
物体 资产 价值 Form1 可访问描述 订单表格 AccessibleName 订单表单 字体大小 10 文本 披萨订单表格 PictureBox 名称 商标 可访问描述 披萨片 AccessibleName 公司徽标 图片 任何图标或位图 标签 名称 公司标签 文本 好披萨 TabIndex 1 可访问描述 公司名称 AccessibleName 公司名称 背景色 蓝 前景色 黄色 字体大小 18 标签 名称 客户标签 文本 姓名 TabIndex 2 可访问描述 客户名称标签 AccessibleName 客户名称标签 UseMnemonic 真 实 文本框 名称 客户名称 文本 (无) TabIndex 3 可访问描述 客户名称 AccessibleName 客户名称 GroupBox 名称 尺寸选项 可访问描述 披萨大小选项 AccessibleName 披萨大小选项 文本 披萨大小 TabIndex 4 RadioButton 名称 smallPizza 文本 &小号 $6.00 已选中 真 实 TabIndex 0 可访问描述 小披萨 AccessibleName 小披萨 RadioButton 名称 largePizza 文本 &Large $10.00 TabIndex 1 可访问描述 大披萨 AccessibleName 大披萨 标签 名称 toppingsLabel 文本 &Toppings (每张 0.75 美元) TabIndex 5 可访问描述 浇头标签 AccessibleName 配料标签 UseMnemonic 真 实 CheckedListBox 名称 浇头 TabIndex 6 可访问描述 可用浇头 AccessibleName 可选配料 物品 佩波尼、香肠、蘑菇 按钮 名称 订单 文本 &订单 TabIndex 7 可访问描述 订单总数 AccessibleName 总订单数 按钮 名称 取消 文本 &Cancel TabIndex 8 可访问描述 取消订单 AccessibleName 取消订单 MainMenu 名称 主菜单 菜单项 名称 fileCommands 文本 &File 菜单项 名称 退出应用 文本 E&xit 你的窗体将大致如下图所示:
支持高对比度模式
高对比度模式是一种 Windows 系统设置,它通过使用对比度颜色和字体大小来改善可读性,这些颜色和字体大小对视觉受损的用户有利。 提供此属性 HighContrast 以确定是否设置了高对比度模式。
如果 SystemInformation.HighContrast 为 true
,则应用程序应:
使用系统配色方案显示所有用户界面元素
通过视觉提示或声音传达任何通过颜色传达的信息。 例如,如果使用红色字体突出显示特定列表项,则还可以向字体添加粗体,以便用户具有突出显示项目的非颜色提示。
省略文本后面的任何图像或模式
应用程序在启动时应检查HighContrast的设置,并响应系统事件UserPreferenceChanged。 每当HighContrast的值发生变化时,UserPreferenceChanged事件就会被引发。
在我们的应用程序中,唯一不使用系统设置颜色的元素是 lblCompanyName
。 该 SystemColors 类用于将标签的颜色设置更改为用户选择的系统颜色。
以有效方式启用高对比度模式
创建一种方法,将标签的颜色设置为系统颜色。
Private Sub SetColorScheme() If SystemInformation.HighContrast Then companyLabel.BackColor = SystemColors.Window companyLabel.ForeColor = SystemColors.WindowText Else companyLabel.BackColor = Color.Blue companyLabel.ForeColor = Color.Yellow End If End Sub
private void SetColorScheme() { if (SystemInformation.HighContrast) { companyLabel.BackColor = SystemColors.Window; companyLabel.ForeColor = SystemColors.WindowText; } else { companyLabel.BackColor = Color.Blue; companyLabel.ForeColor = Color.Yellow; } }
在窗体构造函数中调用
SetColorScheme
过程(在 Visual Basic 中为Public Sub New()
,在 Visual C# 中为public Form1()
)。 若要在 Visual Basic 中访问构造函数,需要展开标记为 Windows 窗体设计器生成的代码的区域。Public Sub New() MyBase.New() InitializeComponent() SetColorScheme() End Sub
public Form1() { InitializeComponent(); SetColorScheme(); }
使用相应的签名创建事件过程以响应事件 UserPreferenceChanged 。
Protected Sub UserPreferenceChanged(sender As Object, _ e As Microsoft.Win32.UserPreferenceChangedEventArgs) SetColorScheme() End Sub
public void UserPreferenceChanged(object sender, Microsoft.Win32.UserPreferenceChangedEventArgs e) { SetColorScheme(); }
在调用
InitializeComponents
表单构造函数后,向表单构造函数添加代码,以将事件过程挂接到系统事件。 此方法调用SetColorScheme
过程。Public Sub New() MyBase.New() InitializeComponent() SetColorScheme() AddHandler Microsoft.Win32.SystemEvents.UserPreferenceChanged, _ AddressOf Me.UserPreferenceChanged End Sub
public Form1() { InitializeComponent(); SetColorScheme(); Microsoft.Win32.SystemEvents.UserPreferenceChanged += new Microsoft.Win32.UserPreferenceChangedEventHandler( this.UserPreferenceChanged); }
将代码添加到窗体Dispose方法中,调用基类的Dispose方法之前,以确保应用程序关闭时释放事件。 若要访问 Dispose Visual Basic 中的方法,需要展开标记为 Windows 窗体设计器生成的代码的区域。
注释
系统事件代码运行独立于主应用程序的线程。 如果未释放事件,则即使程序关闭,连接到事件的代码也会运行。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing AndAlso components IsNot Nothing Then components.Dispose() End If RemoveHandler Microsoft.Win32.SystemEvents.UserPreferenceChanged, _ AddressOf Me.UserPreferenceChanged MyBase.Dispose(disposing) End Sub
protected override void Dispose(bool disposing) { if(disposing && components != null) { components.Dispose(); } Microsoft.Win32.SystemEvents.UserPreferenceChanged -= new Microsoft.Win32.UserPreferenceChangedEventHandler( this.UserPreferenceChanged); base.Dispose( disposing ); }
按 F5 运行应用程序。
通过声音以外的方式传达重要信息
在此应用程序中,不会单独通过声音传达任何信息。 如果在应用程序中使用声音,则还应通过一些其他方式提供信息。
以声音以外的其他方式提供信息
使用 Windows API 函数 FlashWindow 使标题栏闪烁。 有关如何调用 Windows API 函数的示例,请参阅 演练:调用 Windows API。
注释
用户可能已启用 Windows SoundSentry 服务,这也将导致当系统声音通过计算机的内置扬声器播放时窗口闪烁。
在非模式窗口中显示重要信息,以便用户可以对其进行响应。
显示一个能够获取键盘焦点的消息框。 当用户可能正在键入时,请避免此方法。
在任务栏的状态通知区域中显示状态指示器。 有关详细信息,请参阅 使用 Windows 窗体 NotifyIcon 组件向任务栏添加应用程序图标。
测试应用程序
在部署应用程序之前,应测试已实现的辅助功能。
测试辅助功能特性
若要测试键盘访问,请拔下鼠标,并使用键盘导航每个功能的用户界面。 确保只能使用键盘执行所有任务。
若要测试对高对比度的支持,请在控制面板中选择“辅助功能选项”图标。 单击“显示”选项卡,然后选择“使用高对比度”复选框。 浏览所有用户界面元素,以确保颜色和字体更改得到反映。 此外,请确保省略在文本后面绘制的图像或模式。
注释
Windows NT 4 在控制面板中没有辅助功能选项图标。 因此,更改 SystemInformation.HighContrast 设置的过程在 Windows NT 4 中不起作用。
其他工具随时可用于测试应用程序的可访问性。
若要测试公开键盘焦点,请运行放大镜。 (若要打开它,请单击“开始”菜单,指向“程序”,指向“附件”,指向“辅助功能”,然后单击“放大镜”。 使用键盘选项卡和鼠标导航用户界面。 确保在放大镜中对所有导航进行正确的跟踪。
若要测试公开的屏幕元素,请运行“检查”,并使用鼠标和 TAB 键访问每个元素。 确保“检查”窗口的“名称”、“状态”、“角色”、“位置”和“值”字段中显示的信息对 UI 中的每个对象都有意义。