Propriétés d’automatisation dans Xamarin.Forms
Xamarin.Forms permet de définir des valeurs d’accessibilité sur des éléments d’interface utilisateur à l’aide des propriétés jointes de la classe AutomationProperties, qui définissent à leur tour des valeurs d’accessibilité natives. Cet article explique comment utiliser la classe AutomationProperties pour permettre à un lecteur d’écran d’énoncer les éléments figurant dans la page.
Xamarin.Forms permet aux propriétés d’automatisation d’être définies sur les éléments de l’interface utilisateur via les propriétés jointes suivantes :
AutomationProperties.IsInAccessibleTree
– indique si l’élément est disponible pour une application accessible. Pour plus d’informations, consultez AutomationProperties.IsInAccessibleTree.AutomationProperties.Name
– brève description de l’élément qui sert d’identificateur prononçable pour l’élément. Pour plus d’informations, consultez AutomationProperties.Name.AutomationProperties.HelpText
– description plus longue de l’élément, qui peut être considérée comme un texte d’info-bulle associé à l’élément. Pour plus d’informations, consultez AutomationProperties.HelpText.AutomationProperties.LabeledBy
– permet à un autre élément de définir des informations d’accessibilité pour l’élément actuel. Pour plus d’informations, consultez AutomationProperties.LabeledBy.
Ces propriétés jointes définissent des valeurs natives d’accessibilité pour permettre à un lecteur d’écran d’énoncer l’élément. Pour plus d’informations sur les propriétés jointes, consultez Propriétés jointes.
Important
L’utilisation des propriétés jointes AutomationProperties
peut avoir un impact sur l’exécution des tests de l’interface utilisateur dans Android. Les propriétés AutomationId
, AutomationProperties.Name
et AutomationProperties.HelpText
définissent la propriété native ContentDescription
, avec les valeurs de propriété AutomationProperties.Name
et AutomationProperties.HelpText
qui sont prioritaires sur la valeur AutomationId
(si AutomationProperties.Name
et AutomationProperties.HelpText
sont tous deux définis, les valeurs sont concaténées). Cela signifie que tous les tests recherchant AutomationId
échouent si AutomationProperties.Name
ou AutomationProperties.HelpText
sont également définis sur l’élément. Dans ce scénario, les tests d’interface utilisateur doivent être modifiés pour rechercher la valeur de AutomationProperties.Name
ou de AutomationProperties.HelpText
, ou une concaténation des deux.
Chaque plateforme dispose d’un lecteur d’écran différent pour effectuer la narration des valeurs d’accessibilité :
- iOS dispose de VoiceOver. Pour plus d’informations, consultez Tester l’accessibilité sur votre appareil avec VoiceOver sur developer.apple.com.
- Android dispose de TalkBack. Pour plus d’informations, consultez Test de l’accessibilité de votre application sur developer.android.com.
- Windows dispose du Narrateur. Pour plus d’informations, consultez Vérifier les principaux scénarios d’application à l’aide du Narrateur.
Toutefois, le comportement exact d’un lecteur d’écran dépend du logiciel et de sa configuration par l’utilisateur. Par exemple, la plupart des lecteurs d’écran lisent le texte associé à un contrôle lorsque ce dernier reçoit le focus, permettant aux utilisateurs de s’orienter lorsqu’ils se déplacent parmi les contrôles sur la page. Certains lecteurs d’écran lisent également l’interface utilisateur entière de l’application quand une page s’affiche, ce qui permet à l’utilisateur de recevoir tout le contenu informatif disponible de la page avant d’essayer de le parcourir.
Les lecteurs d’écran lisent également des valeurs d’accessibilité différentes. Dans l'exemple d'application :
- VoiceOver lit la valeur
Placeholder
de l’objetEntry
, suivie des instructions d’utilisation du contrôle. - VoiceOver lit la valeur
Placeholder
de l’objetEntry
, suivie de la valeurAutomationProperties.HelpText
et des instructions d’utilisation du contrôle. - Le Narrateur lit la valeur
AutomationProperties.LabeledBy
de l’objetEntry
, suivie des instructions d’utilisation du contrôle.
En outre, le Narrateur accorde la priorité à AutomationProperties.Name
, à AutomationProperties.LabeledBy
puis à AutomationProperties.HelpText
. Dans Android, TalkBack peut combiner les valeurs AutomationProperties.Name
et AutomationProperties.HelpText
. Par conséquent, il est recommandé de réaliser des tests d’accessibilité complets sur chaque plateforme pour garantir une expérience optimale.
AutomationProperties.IsInAccessibleTree
La propriété jointe AutomationProperties.IsInAccessibleTree
est un boolean
qui détermine si l’élément est accessible et par conséquent visible aux lecteurs d’écran. Elle doit être définie sur true
pour utiliser les autres propriétés jointes d’accessibilité. Cela peut être accompli en XAML de la façon suivante :
<Entry AutomationProperties.IsInAccessibleTree="true" />
Elle peut également être définie en C# comme suit :
var entry = new Entry();
AutomationProperties.SetIsInAccessibleTree(entry, true);
Remarque
Notez que la méthode SetValue
peut également être utilisée pour définir la propriété jointe AutomationProperties.IsInAccessibleTree
– entry.SetValue(AutomationProperties.IsInAccessibleTreeProperty, true);
AutomationProperties.Name
La valeur de la propriété jointe AutomationProperties.Name
doit être une brève chaîne de texte descriptive qu’un lecteur d’écran utilise pour annoncer un élément. Cette propriété doit être définie pour les éléments qui ont une signification importante pour comprendre le contenu ou interagir avec l’interface utilisateur. Cela peut être accompli en XAML de la façon suivante :
<ActivityIndicator AutomationProperties.IsInAccessibleTree="true"
AutomationProperties.Name="Progress indicator" />
Elle peut également être définie en C# comme suit :
var activityIndicator = new ActivityIndicator();
AutomationProperties.SetIsInAccessibleTree(activityIndicator, true);
AutomationProperties.SetName(activityIndicator, "Progress indicator");
Remarque
Notez que la méthode SetValue
peut également être utilisée pour définir la propriété jointe AutomationProperties.Name
– activityIndicator.SetValue(AutomationProperties.NameProperty, "Progress indicator");
AutomationProperties.HelpText
La propriété jointe AutomationProperties.HelpText
doit être définie sur le texte qui décrit l’élément d’interface utilisateur, et peut être considérée comme un texte d’info-bulle associé à l’élément. Cela peut être accompli en XAML de la façon suivante :
<Button Text="Toggle ActivityIndicator"
AutomationProperties.IsInAccessibleTree="true"
AutomationProperties.HelpText="Tap to toggle the activity indicator" />
Elle peut également être définie en C# comme suit :
var button = new Button { Text = "Toggle ActivityIndicator" };
AutomationProperties.SetIsInAccessibleTree(button, true);
AutomationProperties.SetHelpText(button, "Tap to toggle the activity indicator");
Remarque
Notez que la méthode SetValue
peut également être utilisée pour définir la propriété jointe AutomationProperties.HelpText
– button.SetValue(AutomationProperties.HelpTextProperty, "Tap to toggle the activity indicator");
Sur certaines plateformes, pour modifier des contrôles tels qu’un objet Entry
, la propriété HelpText
peut parfois être omise et remplacée par un texte d’espace réservé. Par exemple, « Entrez ici votre nom » est un bon candidat pour la propriété Entry.Placeholder
qui place le texte dans le contrôle avant que l’utilisateur l’entre réellement.
AutomationProperties.LabeledBy
La propriété jointe AutomationProperties.LabeledBy
permet à un autre élément de définir des informations d’accessibilité pour l’élément actuel. Par exemple, un Label
en regard d’un objet Entry
peut être utilisé pour décrire ce que l’objet Entry
représente. Cela peut être accompli en XAML de la façon suivante :
<Label x:Name="label" Text="Enter your name: " />
<Entry AutomationProperties.IsInAccessibleTree="true"
AutomationProperties.LabeledBy="{x:Reference label}" />
Elle peut également être définie en C# comme suit :
var nameLabel = new Label { Text = "Enter your name: " };
var entry = new Entry();
AutomationProperties.SetIsInAccessibleTree(entry, true);
AutomationProperties.SetLabeledBy(entry, nameLabel);
Important
Il AutomationProperties.LabeledByProperty
n’est pas encore pris en charge sur iOS.
Remarque
Notez que la méthode SetValue
peut également être utilisée pour définir la propriété jointe AutomationProperties.IsInAccessibleTree
– entry.SetValue(AutomationProperties.LabeledByProperty, nameLabel);
Subtilités de l’accessibilité
Les sections suivantes décrivent les subtilités de la définition des valeurs d’accessibilité sur certains contrôles.
NavigationPage
Sur Android, pour définir le texte que les lecteurs d’écran liront pour la flèche Retour dans la barre d’action d’une NavigationPage
, définissez les propriétés AutomationProperties.Name
et AutomationProperties.HelpText
dans une Page
. Toutefois, notez que cette opération n’a aucun effet sur les boutons Retour du système d’exploitation.
FlyoutPage
Sur iOS et la plateforme Windows universelle (UWP), pour définir le texte que les lecteurs d’écran liront pour le bouton bascule d’une FlyoutPage
, définissez les propriétés AutomationProperties.Name
et AutomationProperties.HelpText
dans la FlyoutPage
ou la propriété IconImageSource
dans la page Flyout
.
Sur Android, pour définir le texte que les lecteurs d’écran liront pour le bouton bascule dans une FlyoutPage
, ajoutez des ressources de chaîne au projet Android :
<resources>
<string name="app_name">Xamarin Forms Control Gallery</string>
<string name="btnMDPAutomationID_open">Open Side Menu message</string>
<string name="btnMDPAutomationID_close">Close Side Menu message</string>
</resources>
Ensuite, définissez la propriété AutomationId
de la propriété IconImageSource
de la page Flyout
sur la chaîne appropriée :
var flyout = new ContentPage { ... };
flyout.IconImageSource.AutomationId = "btnMDPAutomationID";
ToolbarItem
Sur iOS, Android et UWP, les lecteurs d’écran liront la valeur de propriété Text
des instances ToolbarItem
, à condition que les valeurs AutomationProperties.Name
ou AutomationProperties.HelpText
ne soient pas définies.
Sur iOS et UWP, la valeur de propriété AutomationProperties.Name
remplacera la valeur de propriété Text
lue par le lecteur d’écran.
Sur Android, les valeurs de propriété AutomationProperties.Name
et/ou AutomationProperties.HelpText
remplaceront complètement les valeurs de propriété Text
à la fois visibles et lues par les lecteurs d’écran. Notez qu’il s’agit d’une limitation des API inférieures à 26.