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 pour AutomationProperties.Name.
  • Pour un Button, AutomationProperties.Name va être déduit du Control qui s’y trouve. Si c’est un TexBlock, 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
Jérémy Jeanson

Comments

You have to be logged in to comment this post.