Comment MVVM peut améliorer l’accessibilité ?
Rendre accessible une application XAML / MVVM n’est pas toujours facile. Si vous utilisez une application de tests tel que Acessibility Insights (https://accessibilityinsights.io/) vous vous rendrez compte que par moment, le texte proposé au narrateur pour décrire l’interface graphique est le nom d’une classe C# (namespace compris).
Autant dire que cette aide n’en est pas une.
Pourquoi un tel comportement ?
Le texte fourni au narrateur est fourni par le Control
à la racine du Template
(via sa propriété AutomationProperties.Name
). Chaque Control
va avoir un comportement différent.
Voici quelques cas :
- Si votre premier Control est un
TextBlock
, la propriétéText
est utilisée par défaut pourAutomationProperties.Name
. - Pour un
Button
,AutomationProperties.Name
va être déduit duControl
qui s’y trouve. Si c’est unTexBlock
, son texte est utilisé. - ...
Dans le cas où le Control
n’a pas une propriété éligible pour alimenter AutomationProperties.Name
, la propriété est déduite du Context
(DataContext
, BindingContext
).
La solution manuelle
Si vous êtes en mesure, d’alimenter AutomationProperties.Name
pour chaque Control
ou Template
, tout va bien. Cela demande cependant un effort important.
Si un Control
n’a pas d’information ayant un intérêt pour un utilisateur aveugle, il faut masquer le Control
au narrateur. Pour cela, on utiliser la propriété AutomationProperties.AccessibilityView
.
<Control AutomationProperties.AccessibilityView="Raw">
...
</Control>
La solution automatique
Heureusement, avec .net, il y a une solution simple : utiliser la méthode ToString()
pour que chaque classe retourne un texte exploitable par le narrateur.
Dans le contexte d’un MVVM, il convient de l’appliquer sur :
- Les Models.
- Les ViewModels.
- Les Commands (oui, rient ne vous interdit de fournir un texte lors de l’instanciation d’une commande et de l’utiliser dans la méthode
ToString()
).
Ainsi, chaque classe fournie à l’interface graphique aura un texte de substitution intéressant.
Ex. : Nombre de mes ViewModels ont une propriété Title
(en lecture seule) pour afficher un titre en haut de Page ou boite de dialogue. Ma réécriture de ToString()
s’appuie donc dessus.
#region Accessibilité
public override string ToString()
{
return Title;
}
#endregion