WinForms应用中RichTextBox控件忽略AccessibleName属性的无障碍问题咨询
问题原因
该问题是WinForms框架的历史遗留缺陷,并非代码配置错误导致。WinForms的RichTextBox本质是对Windows系统原生Rich Edit控件的封装,原生控件的无障碍实现优先级高于WinForms层的默认AccessibleObject逻辑:原生控件会优先读取符合规则的前置相邻Label的文本作为无障碍名称,如果未检测到对应Label,会直接返回系统默认的“Rich Edit control”文本,你在控件属性中设置的AccessibleName没有被正确映射到原生控件的IAccessible接口属性层,因此会被直接忽略。
替代解决方案
- 自定义RichTextBox控件,重写无障碍实例创建逻辑
这是兼容性最好、适用所有场景的方案,通过重写CreateAccessibilityInstance方法返回自定义的无障碍对象,直接优先读取控件设置的AccessibleName属性,绕过原生控件的默认逻辑,示例代码如下:
public class AccessibleRichTextBox : RichTextBox { protected override AccessibleObject CreateAccessibilityInstance() { return new AccessibleRichTextBoxAccessibleObject(this); } private class AccessibleRichTextBoxAccessibleObject : ControlAccessibleObject { public AccessibleRichTextBoxAccessibleObject(AccessibleRichTextBox owner) : base(owner) { } public override string Name { get { // 优先返回开发者设置的AccessibleName if (!string.IsNullOrEmpty(Owner.AccessibleName)) { return Owner.AccessibleName; } // 未设置时回退到默认逻辑 return base.Name; } set => base.Name = value; } } }
你只需要将项目中原有的RichTextBox替换为上面的AccessibleRichTextBox,直接设置AccessibleName属性即可正常被屏幕阅读器识别。
- 升级.NET运行时版本
如果你使用的是.NET Core 3.1/.NET 5+版本的WinForms应用,可以尝试升级到最新的正式版SDK,微软在较新版本的WinForms运行时中已经修复了该AccessibleName映射问题,无需修改控件代码即可生效。
内容的提问来源于stack exchange,提问作者Allen Clark Copeland Jr
相关产品推荐
相关产品推荐

