Asigurați-vă că WinForms Custom Control funcționează cu Naratorul (Accesibilitate)

Am un control de listă personalizat derivat din clasa Control .

Trebuie să îl fac accesibil persoanelor cu handicap prin MSAA (Microsoft Active Accesibilitate) .

Până în prezent, înțeleg că trebuie să creez o clasă care moștenește de la ControlAccessibleObject și apoi să returneze instanța în metoda Control.CreateAccessibilityInstance .

Problema este că am implementat acest lucru și nu pare să funcționeze cu instrumentul Windows Narrator.

De exemplu, când fac clic pe un element din ListView standard, Naratorul răspunde la textul selectat.

Dar când fac clic pe elementul din controlul meu nu se întâmplă nimic (deși textul elementului este solicitat în implementarea ControlAccessibleObject ),

Am crezut că trebuie să pună în aplicare și IAccessible , dar m-am uitat la codul sursă refrence .NET și ListaView nu implementează această interfață. Am crezut că poate acest lucru este implementat în controlul Win32 înfășurat, așa că am aruncat o privire asupra controlului similar - DataGridView - dar acest lucru nu implementează și IAccessible.

DataGridView au suport de accesibilitate, dar, desi am copiat tot codul important al DataGridViewAccessibleObject, tot nu functioneaza sub controlul meu.

Poate cineva să aibă mai multă experiență cu accesibilitatea controlului personalizat în WinForms?

0
Pentru că am un control particularizat care moștenește direct din clasa Control , nu de la niciunul din controalele WinForms existente.
adăugat autor Libor, sursa
De ce nu utilizați suportul încorporat? Rețineți proprietățile de control care încep cu "Accesibil", chiar le puteți seta în designer.
adăugat autor Hans Passant, sursa
adăugat autor Hans Passant, sursa

1 răspunsuri

Bine, am aflat: Metoda Control.AccessibilityNotifyClients face magia. Unul trebuie să suprascrie această metodă într-un control derivat.

Cu toate acestea, pentru a face cititorii de ecran să vorbească textul, a trebuit să apel:

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

Aici index este un index al elementului nou selectat.

Am găsit acest cod în sursa de referință .NET a CheckedListBox. Când am folosit exclusiv eveniment Focus sau Selecție, cititorul de ecran nu a reacționat. Textul vorbit depinde și de starea AccessibleObject care corespunde unui element nou selectat.

0
adăugat