Propiedades de automatización de Xamarin.Forms
Xamarin.Forms permite que los valores de accesibilidad se establezcan en elementos de la interfaz de usuario mediante el uso de las propiedades adjuntas de la clase AutomationProperties, que a su vez establece valores de accesibilidad nativa. Este artículo explica cómo usar la clase AutomationProperties, para que un lector de pantalla pueda leer los elementos en la página.
Xamarin.Forms permite que las propiedades de automatización se establezcan en elementos de la interfaz de usuario a través de las propiedades adjuntas siguientes:
AutomationProperties.IsInAccessibleTree
: indica si el elemento está disponible para una aplicación accesible. Para obtener más información, consulte AutomationProperties.IsInAccessibleTree.AutomationProperties.Name
: una breve descripción del elemento que actúa como un identificador con capacidad de lectura para el elemento. Para obtener más información, consulte AutomationProperties.Name.AutomationProperties.HelpText
: una descripción más larga del elemento, que puede considerarse como el texto de información sobre herramientas asociado al elemento. Para obtener más información, consulte AutomationProperties.HelpText.AutomationProperties.LabeledBy
: permite que otro elemento defina la información de accesibilidad para el elemento actual. Para obtener más información, consulte AutomationProperties.LabeledBy.
Estas propiedades adjuntas establecen los valores de accesibilidad nativa para que un lector de pantalla pueda leer el elemento. Para más información sobre las propiedades adjuntas, consulte Propiedades asociadas.
Importante
El uso de las propiedades adjuntas AutomationProperties
puede afectar a la ejecución de prueba de IU en Android. Las propiedades AutomationId
, AutomationProperties.Name
y AutomationProperties.HelpText
, establecen la propiedad ContentDescription
nativa, con los valores de propiedad AutomationProperties.Name
y AutomationProperties.HelpText
con prioridad sobre el valor AutomationId
(si tanto AutomationProperties.Name
como AutomationProperties.HelpText
están establecidos, los valores se concatenarán). Esto significa que cualquier prueba que busque AutomationId
fallará si AutomationProperties.Name
o AutomationProperties.HelpText
también están establecidos en el elemento. En este escenario, las pruebas de IU deben modificarse para buscar el valor de AutomationProperties.Name
o AutomationProperties.HelpText
, o una concatenación de ambos.
Cada plataforma tiene un lector de pantalla diferente para leer los valores de accesibilidad:
- iOS tiene VoiceOver. Para obtener más información, consulte Test Accessibility on Your Device with VoiceOver (Probar la accesibilidad en un dispositivo con VoiceOver), en developer.apple.com.
- Android tiene TalkBack. Para obtener más información, consulte Testing Your App's Accessibility (Prueba de la accesibilidad de una aplicación), en developer.android.com.
- Windows tiene el Narrador. Para obtener más información, consulte Verify main app scenarios by using Narrator (Comprobar escenarios de aplicaciones principales mediante el uso del Narrador).
Sin embargo, el comportamiento exacto de un lector de pantalla depende del software y de la configuración del usuario en él. Por ejemplo, la mayoría de los lectores de pantalla leen el texto asociado con un control cuando queda focalizado, permitiendo a los usuarios orientarse a medida que se mueven entre los controles en la página. Algunos lectores de pantalla leen también la interfaz de usuario de la aplicación completa cuando aparece una página, lo cual permite que el usuario reciba todo de contenido informativo disponible de la página antes de intentar navegar por ella.
Los lectores de pantalla también leen valores de accesibilidad distintos. En la aplicación de ejemplo:
- VoiceOver leerá el valor
Placeholder
deEntry
, seguido de las instrucciones para usar el control. - TalkBack leerá el valor
Placeholder
deEntry
, seguido del valorAutomationProperties.HelpText
, seguido de las instrucciones para usar el control. - El Narrador leerá el valor
AutomationProperties.LabeledBy
deEntry
, seguido de las instrucciones para usar el control.
Además, el Narrador dará prioridad a AutomationProperties.Name
, AutomationProperties.LabeledBy
y, a continuación, AutomationProperties.HelpText
. En Android, TalkBack puede combinar los valores AutomationProperties.Name
y AutomationProperties.HelpText
. Por lo tanto, se recomienda llevar a cabo pruebas de accesibilidad exhaustivas en cada plataforma para garantizar una experiencia óptima.
AutomationProperties.IsInAccessibleTree
La propiedad adjunta AutomationProperties.IsInAccessibleTree
es un valor boolean
que determina si el elemento es accesible, y por lo tanto visible, para los lectores de pantalla. Debe establecerse en true
para usar las otras propiedades adjuntas de accesibilidad. Esto se puede lograr en XAML de la siguiente manera:
<Entry AutomationProperties.IsInAccessibleTree="true" />
Como alternativa, puede establecerse en C# de la siguiente manera:
var entry = new Entry();
AutomationProperties.SetIsInAccessibleTree(entry, true);
Nota:
Tenga en cuenta que el método SetValue
también se puede utilizar para establecer la propiedad adjunta de AutomationProperties.IsInAccessibleTree
, entry.SetValue(AutomationProperties.IsInAccessibleTreeProperty, true);
AutomationProperties.Name
El valor de la propiedad adjunta AutomationProperties.Name
debe ser una cadena de texto corta y descriptiva que usa un lector de pantalla anunciar un elemento. Esta propiedad debe establecerse para los elementos que tengan un significado que sea importante para comprender el contenido o interactuar con la interfaz de usuario. Esto se puede lograr en XAML de la siguiente manera:
<ActivityIndicator AutomationProperties.IsInAccessibleTree="true"
AutomationProperties.Name="Progress indicator" />
Como alternativa, puede establecerse en C# de la siguiente manera:
var activityIndicator = new ActivityIndicator();
AutomationProperties.SetIsInAccessibleTree(activityIndicator, true);
AutomationProperties.SetName(activityIndicator, "Progress indicator");
Nota:
Tenga en cuenta que el método SetValue
también se puede utilizar para establecer la propiedad adjunta de AutomationProperties.Name
, activityIndicator.SetValue(AutomationProperties.NameProperty, "Progress indicator");
AutomationProperties.HelpText
La propiedad adjunta de AutomationProperties.HelpText
debe establecerse en el texto que describe el elemento de interfaz de usuario y puede ser considerarse el texto de información sobre herramientas asociado al elemento. Esto se puede lograr en XAML de la siguiente manera:
<Button Text="Toggle ActivityIndicator"
AutomationProperties.IsInAccessibleTree="true"
AutomationProperties.HelpText="Tap to toggle the activity indicator" />
Como alternativa, puede establecerse en C# de la siguiente manera:
var button = new Button { Text = "Toggle ActivityIndicator" };
AutomationProperties.SetIsInAccessibleTree(button, true);
AutomationProperties.SetHelpText(button, "Tap to toggle the activity indicator");
Nota:
Tenga en cuenta que el método SetValue
también se puede utilizar para establecer la propiedad adjunta de AutomationProperties.HelpText
, button.SetValue(AutomationProperties.HelpTextProperty, "Tap to toggle the activity indicator");
En algunas plataformas, para editar controles, como un elemento Entry
, la propiedad HelpText
a veces puede omitirse y reemplazarse por el texto de marcador de posición. Por ejemplo, "Escriba aquí su nombre" es un buen candidato para la propiedad Entry.Placeholder
que coloca el texto en el control antes de la entrada real del usuario.
AutomationProperties.LabeledBy
La propiedad adjunta AutomationProperties.LabeledBy
permite que otro elemento defina la información de accesibilidad para el elemento actual. Por ejemplo, un elemento Label
junto a un elemento Entry
puede utilizarse para describir lo que representa Entry
. Esto se puede lograr en XAML de la siguiente manera:
<Label x:Name="label" Text="Enter your name: " />
<Entry AutomationProperties.IsInAccessibleTree="true"
AutomationProperties.LabeledBy="{x:Reference label}" />
Como alternativa, puede establecerse en C# de la siguiente manera:
var nameLabel = new Label { Text = "Enter your name: " };
var entry = new Entry();
AutomationProperties.SetIsInAccessibleTree(entry, true);
AutomationProperties.SetLabeledBy(entry, nameLabel);
Importante
Todavía no se admite AutomationProperties.LabeledByProperty
en iOS.
Nota:
Tenga en cuenta que el método SetValue
también se puede utilizar para establecer la propiedad adjunta de AutomationProperties.IsInAccessibleTree
, entry.SetValue(AutomationProperties.LabeledByProperty, nameLabel);
Pormenores relativos a la accesibilidad
En las secciones siguientes se describen los pormenores que supone el hecho de establecer valores de accesibilidad en ciertos controles.
NavigationPage
En Android, para establecer el texto que el lector de pantalla leerá para la flecha Atrás de la barra de acciones NavigationPage
, defina las propiedades AutomationProperties.Name
y AutomationProperties.HelpText
en Page
. Sin embargo, tenga en cuenta que esto no se aplicará a los botones Atrás del sistema operativo.
FlyoutPage
En iOS y la Plataforma Universal de Windows (UWP), para establecer el texto que el lector de pantalla leerá para el botón de alternancia en FlyoutPage
, defina las propiedades AutomationProperties.Name
y AutomationProperties.HelpText
en FlyoutPage
, o bien en la propiedad IconImageSource
de la página Flyout
.
En Android, para establecer el texto que el lector de pantalla leerá para el botón de alternancia en FlyoutPage
, agregue los recursos de cadena al proyecto de 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>
A continuación, defina la AutomationId
propiedad de la propiedad IconImageSource
de la página Flyout
en la cadena que corresponda:
var flyout = new ContentPage { ... };
flyout.IconImageSource.AutomationId = "btnMDPAutomationID";
ToolbarItem
En iOS, Android y UWP, los lectores de pantalla leerán el valor de propiedad Text
de las instancias de ToolbarItem
, siempre que no haya definido los valores AutomationProperties.Name
y AutomationProperties.HelpText
.
En iOS y UWP, el valor de propiedad AutomationProperties.Name
reemplazará el valor de propiedad Text
que el lector de pantalla lee.
En Android, los valores de propiedad AutomationProperties.Name
o AutomationProperties.HelpText
reemplazarán por completo el valor de propiedad Text
, que es visible y el lector de pantalla leerá. Tenga en cuenta que se trata de una limitación de API inferior a 26.