Partager via


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é :

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’objet Entry, suivie des instructions d’utilisation du contrôle.
  • VoiceOver lit la valeur Placeholder de l’objet Entry, suivie de la valeur AutomationProperties.HelpText et des instructions d’utilisation du contrôle.
  • Le Narrateur lit la valeur AutomationProperties.LabeledBy de l’objet Entry, 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.IsInAccessibleTreeentry.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.NameactivityIndicator.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.HelpTextbutton.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.IsInAccessibleTreeentry.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.

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.