原创

C#

无障碍

C# winform中给控件设置标签方法

2019-09-11 Wednesday 12:30

前言

注:文章中朗读结果均使用争渡2019 春季版,win7 64位测试而出,NVDA在朗读控件类型以及一些细节处理上会有差异,但大致相同。
在C# winform中控件想让辅助应用(例如屏幕阅读器),得知其作用,那就需给控件增加标签。
如果是Button、Lebel,Checkbox、RadioButton这类本身会显示其描述信息的控件,只需跟平常一样设置其Text属性即可,无需做特殊处理。
但如果是TextBox,ComboBox、ListBox等控件,则需要手动为其添加标签,否则当屏幕阅读器浏览到控件时只会朗读其控件类型,例如TextBox,会朗读成
“可编辑文本”
因此我们需给控件添加标签,从而告诉用户控件的作用、意图等。
标签的添加方式有如下几种:

1.添加Label控件,设置其Text属性,并设置其TabIndex与所要关联的控件相邻。

例如要给一个TextBox控件添加标签,那可以将Label的TabIndex属性设置为0,TextBox的TabIndex属性设置为1,这样Windows会自动将此Lebel与TextBox关联,当屏幕阅读器浏览到TextBox时即可朗读出Label控件的Text内容与TextBox控件类型。
以下为具体例子,例子中nameTextBox(账号编辑框)正确设置了标签,passwordTextBox(密码编辑框)没有设置成功。
注:例子均假设控件已添加到Form中,因此省略创建对象等步骤。

nameLabel.Text = "账号";
nameLabel.TabIndex = 0;
nameTextBox.TabIndex = 1;
passwordLabel.Text = "密码";
// passwordLabel的TabIndex属性并没有与passwordTextBox的TabIndex所相邻,因此passwordTextBox并没有所关联的Label
passwordLabel.TabIndex = 10;
passwordTextBox.TabIndex = 2;

当屏幕阅读器浏览到nameTextBox时就会朗读出
“账号 可编辑文本”
而因为passwordLabel的TabIndex并未与passwordTextBox的TabIndex相邻,因此并没有设置标签成功,屏幕阅读器仍朗读成
“可编辑文本”
以下为将Label与控件关联效果演示视频

2.设置Control控件的AccessibleName属性。

此属性为控件的无障碍名称,设置后屏幕阅读器浏览到此控件时会先朗读其AccessibleName指定的内容,然后是控件的类型。
注:如果此控件已有关联的Label,并且也设置了AccessibleName属性,那屏幕阅读器会朗读AccessibleName,而并非所关联的Label。
以下例子中将nameTextBox(账号编辑框)所关联的Label的Text设置为“账号”,nameTextBox的AccessibleName属性设置为“输入账号”,passwordTextBox没有所关联的Label并设置AccessibleName为“密码”

nameLabel.Text = "账号";
nameLabel.TabIndex = 0;
nameTextBox.TabIndex = 1;
nameTextBox.AccessibleName = "输入账号";
passwordLabel.Text = "密码";
// passwordLabel的TabIndex属性并没有与passwordTextBox的TabIndex所相邻,因此passwordTextBox并没有所关联的Label
passwordLabel.TabIndex = 10;
passwordTextBox.TabIndex = 2;
passwordTextBox.AccessibleName = "密码";

当屏幕阅读器浏览到nameTextBox时会朗读出
“输入账号 可编辑文本”
浏览到passwordTextBox时会朗读出
“密码 可编辑文本”
以下为设置AccessibleName属性效果演示视频

3.设置Control控件的AccessibleDescription属性。

此属性为控件的描述信息,一般提供控件的更多提示内容,例如告诉用户账号TextBox里输入的内容是QQ号/邮箱/手机号,那即可设置此属性。
此属性通常在朗读玩控件类型后被朗读,不过使用争渡读屏却不绝对,例如TextBox控件没有关联标签,并且没有设置AccessibleName属性时,那先会朗读其AccessibleDescription内容,然后是控件类型,而NVDA却还是会先朗读控件类型,然后是AccessibleName内容。
以下例子中将nameTextBox(账号编辑框)的AccessibleName属性设置为“账号”,AccessibleDescription属性设置为“QQ号/邮箱/手机号”,passwordTextBox(密码编辑框)不设置AccessibleName,也没有所关联的Label,只设置AccessibleDescription为“输入密码”。

nameTextBox.AccessibleName = "账号";
nameTextBox.AccessibleDescription = "QQ号/邮箱/手机号";
passwordLabel.Text = "密码";
// passwordLabel的TabIndex属性并没有与passwordTextBox的TabIndex所相邻,因此passwordTextBox并没有所关联的Label
passwordLabel.TabIndex = 10;
passwordTextBox.TabIndex = 2;
passwordTextBox.AccessibleDescription = "输入密码";

当屏幕阅读器浏览到nameTextBox就会朗读出
“账号 可编辑文本 QQ号/邮箱/手机号”
注:如果设置TextBox所关联的Label的Text属性为“账号”,朗读出的效果同上。
当争渡读屏浏览到passwordTextBox时就会朗读出
“输入密码 可编辑文本”
而使用NVDA则会朗读成
“编辑框 输入密码 空白”
以下为争渡读屏浏览设置AccessibleDescription属性控件效果演示视频

以下为NVDA读屏浏览设置AccessibleDescription属性控件效果演示视频


随手打赏
关闭

感谢您的支持!

扫码打赏,你说多少就多少
打赏二维码

打开

支付宝

扫一扫,即可进行扫码打赏哦