3

我有一个从Control类派生的自定义列表控件。

我需要通过MSAA (Microsoft Active Accessibility)让残障人士可以访问它。

到目前为止,我知道我需要创建从ControlAccessibleObject继承的类,然后在Control.CreateAccessibilityInstance方法覆盖中返回其实例。

问题是我已经实现了这个,它似乎不适用于 Windows 讲述人工具。

例如,当我单击标准 ListView 中的某个项目时,讲述人会说出所选项目的文本。

但是当我单击控件中的项目时,什么也没有发生(尽管在我的ControlAccessibleObject实现中请求了项目文本)

我以为我也需要实现IAccessible,但是我查看了 .NET refrence 源代码,而 ListView 没有实现这个接口。我想这可能是在包装的 Win32 控件中实现的,所以我看了一下类似的控件——DataGridView——但这也没有实现 IAccessible。

DataGridView 有辅助功能支持,但是虽然我复制了 DataGridViewAccessibleObject 的所有重要代码,但它在我的控件中仍然不起作用。

是否有人对 WinForms 中的自定义控件可访问性有更多经验?

4

1 回答 1

1

好的,我找到了:Control.AccessibilityNotifyClients方法很神奇。必须在派生控件中重写此方法。

但是,为了让屏幕阅读器朗读文本,我不得不调用:

AccessibilityNotifyClients(AccessibleEvents.Focus, index);
AccessibilityNotifyClients(AccessibleEvents.Selection, index);

这里的索引是新选择的项目的索引。

我在 CheckedListBox 的 .NET 参考源中找到了这段代码。当我单独使用 Focus 或 Selection 事件时,屏幕阅读器没有反应。语音文本还取决于与新选择的项目相对应的AccessibleObject状态。

于 2012-06-03T18:42:22.377 回答