3

Controlクラスから派生したカスタム リスト コントロールがあります。

MSAA (Microsoft Active Accessibility)を通じて、障害のある人がアクセスできるようにする必要があります。

これまでのところ、 ControlAccessibleObjectから継承するクラスを作成し、そのインスタンスをControl.CreateAccessibilityInstanceメソッドのオーバーライドで返す必要があることを理解しています。

問題は、これを実装したことですが、Windows ナレーター ツールでは機能しないようです。

たとえば、標準の ListView でアイテムをクリックすると、ナレーターが選択したアイテムのテキストを読み上げます。

しかし、コントロール内の項目をクリックしても何も起こりません (項目テキストはControlAccessibleObject実装で要求されます) 。

IAccessibleも実装する必要があると思いましたが、.NET 参照ソース コードを調べたところ、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 に答える