Свойства автоматизации в Xamarin.Forms

Download Sample Скачайте пример

Xamarin.Forms позволяет задавать значения специальных возможностей в элементах пользовательского интерфейса с помощью присоединенных свойств из класса AutomationProperties, которые, в свою очередь, задают собственные значения специальных возможностей. Эта статья поясняет, как использовать класс AutomationProperties, чтобы средство чтения с экрана могло озвучивать элементы на странице.

Xamarin.Forms позволяет задавать свойства автоматизации в элементах пользовательского интерфейса с помощью следующих присоединенных свойств:

  • AutomationProperties.IsInAccessibleTree — указывает, доступен ли элемент приложению специальных возможностей. Дополнительные сведения см. в разделе AutomationProperties.IsInAccessibleTree.
  • AutomationProperties.Name — краткое описание элемента, выступающего в качестве произносимого идентификатора для элемента. Дополнительные сведения см. в разделе AutomationProperties.Name.
  • AutomationProperties.HelpText — более подробное описание элемента, которое можно рассматривать как текст подсказки, связанный с элементом. Дополнительные сведения см. в разделе AutomationProperties.HelpText.
  • AutomationProperties.LabeledBy — позволяет другому элементу определить сведения о специальных возможностях для текущего элемента. Дополнительные сведения см. в разделе AutomationProperties.LabeledBy.

Эти присоединенные свойства задают собственные значения специальных возможностей таким образом, чтобы средство чтения с экрана могло озвучить сведения об элементе. Дополнительные сведения о присоединенных свойствах см. в разделе Присоединенные свойства.

Внимание

Использование присоединенных свойств AutomationProperties может влиять на выполнение тестов пользовательского интерфейса в Android. Свойства AutomationId, AutomationProperties.Name и AutomationProperties.HelpText задают собственное свойство ContentDescription, при этом значения свойств AutomationProperties.Name и AutomationProperties.HelpText имеют приоритет над значением AutomationId (если задано как AutomationProperties.Name, так и AutomationProperties.HelpText, эти значения будут сцеплены). Это означает, что все тесты, ищущие AutomationId, завершатся ошибкой, если для элемента также задано AutomationProperties.Name или AutomationProperties.HelpText. В этом случае тесты пользовательского интерфейса следует изменить для поиска значения AutomationProperties.Name или AutomationProperties.HelpText либо объединения этих значений.

Каждая платформа имеет отдельное средство чтения с экрана для озвучивания значений специальных возможностей:

Однако точное поведение средства чтения с экрана зависит от программного обеспечения и его настройки пользователем. Например, большинство средств чтения с экрана зачитывают текст с элемента управления, когда на него переключается фокус, что позволяет пользователям ориентироваться при переходе между элементами управления на странице. Некоторые средства чтения с экрана также считывают весь пользовательский интерфейс приложения при отображении страницы, что позволяет пользователю получить все доступные на странице сведения, прежде чем пытаться перемещаться по ней.

Кроме того, средства чтения с экрана зачитывают разные значения специальных возможностей. В рассматриваемом примере приложения:

  • VoiceOver зачитает значение Placeholder объекта Entry, а затем инструкцию по использованию этого элемента управления;
  • TalkBack зачитает значение Placeholder объекта Entry, затем значение AutomationProperties.HelpText, а затем инструкцию по использованию этого элемента управления;
  • экранный диктор зачитает значение AutomationProperties.LabeledBy объекта Entry, а затем инструкцию по использованию этого элемента управления.

Кроме того, экранный диктор расставит приоритеты следующим образом: AutomationProperties.Name, AutomationProperties.LabeledBy и затем AutomationProperties.HelpText. TalkBack в Android может сочетать значения AutomationProperties.Name и AutomationProperties.HelpText. Поэтому для обеспечения оптимальной работы рекомендуется тщательно протестировать специальные возможности для каждой платформы.

AutomationProperties.IsInAccessibleTree

Присоединенное свойство AutomationProperties.IsInAccessibleTree является boolean, определяющим, доступен ли элемент (и, соответственно, видят ли его средства чтения с экрана). Чтобы использовать другие присоединенные свойства специальных возможностей, для него нужно задать значение true. Это можно сделать в XAML следующим образом:

<Entry AutomationProperties.IsInAccessibleTree="true" />

Кроме того, его можно задать в C# следующим образом:

var entry = new Entry();
AutomationProperties.SetIsInAccessibleTree(entry, true);

Примечание.

Обратите внимание, что метод SetValue также можно использовать для задания присоединенного свойства AutomationProperties.IsInAccessibleTree — entry.SetValue(AutomationProperties.IsInAccessibleTreeProperty, true);

AutomationProperties.Name

Значением присоединенного свойства AutomationProperties.Name должна быть короткая описательная текстовая строка, которую средство чтения с экрана использует для объявления элемента. Это свойство должно быть задано для элементов, значение которых важно для понимания содержимого или взаимодействия с пользовательским интерфейсом. Это можно сделать в XAML следующим образом:

<ActivityIndicator AutomationProperties.IsInAccessibleTree="true"
                   AutomationProperties.Name="Progress indicator" />

Кроме того, его можно задать в C# следующим образом:

var activityIndicator = new ActivityIndicator();
AutomationProperties.SetIsInAccessibleTree(activityIndicator, true);
AutomationProperties.SetName(activityIndicator, "Progress indicator");

Примечание.

Обратите внимание, что метод SetValue также можно использовать для задания присоединенного свойства AutomationProperties.Name — activityIndicator.SetValue(AutomationProperties.NameProperty, "Progress indicator");

AutomationProperties.HelpText

Для присоединенного свойства AutomationProperties.HelpText нужно задать текст, который описывает данный элемент пользовательского интерфейса и может рассматриваться как текст подсказки, связанный с элементом. Это можно сделать в XAML следующим образом:

<Button Text="Toggle ActivityIndicator"
        AutomationProperties.IsInAccessibleTree="true"
        AutomationProperties.HelpText="Tap to toggle the activity indicator" />

Кроме того, его можно задать в C# следующим образом:

var button = new Button { Text = "Toggle ActivityIndicator" };
AutomationProperties.SetIsInAccessibleTree(button, true);
AutomationProperties.SetHelpText(button, "Tap to toggle the activity indicator");

Примечание.

Обратите внимание, что метод SetValue также можно использовать для задания присоединенного свойства AutomationProperties.HelpText — button.SetValue(AutomationProperties.HelpTextProperty, "Tap to toggle the activity indicator");

На некоторых платформах для редактирования элементов управления, таких как Entry, свойство HelpText иногда можно опустить и заменить текстом заполнителя. Например, элемент "Введите здесь свое имя" является хорошим кандидатом для использования в свойстве Entry.Placeholder, которое помещает текст в элемент управления до фактического ввода данных пользователем.

AutomationProperties.LabeledBy

Присоединенное свойство AutomationProperties.LabeledBy позволяет другому элементу определить сведения о специальных возможностях для текущего элемента. Например, расположение Label рядом с Entry можно использовать для описания того, что представляет Entry. Это можно сделать в XAML следующим образом:

<Label x:Name="label" Text="Enter your name: " />
<Entry AutomationProperties.IsInAccessibleTree="true"
       AutomationProperties.LabeledBy="{x:Reference label}" />

Кроме того, его можно задать в C# следующим образом:

var nameLabel = new Label { Text = "Enter your name: " };
var entry = new Entry();
AutomationProperties.SetIsInAccessibleTree(entry, true);
AutomationProperties.SetLabeledBy(entry, nameLabel);

Внимание

AutomationProperties.LabeledByProperty пока не поддерживается в iOS.

Примечание.

Обратите внимание, что метод SetValue также можно использовать для задания присоединенного свойства AutomationProperties.IsInAccessibleTree — entry.SetValue(AutomationProperties.LabeledByProperty, nameLabel);

Особенности специальных возможностей

Следующие разделы описывают особенности настройки специальных возможностей у определенных элементов управления.

На Android, чтобы задать текст средства чтения с экрана, который будет произноситься для стрелки "назад" в панели действий NavigationPage, используйте свойства AutomationProperties.Name и AutomationProperties.HelpText класса Page. Однако учтите, что это не относится к кнопкам "назад" в операционной системе.

FlyoutPage

На iOS и универсальной платформе Windows (UWP), чтобы задать текст средства чтения с экрана, который будет произноситься для выключателя в FlyoutPage, используйте либо свойства AutomationProperties.Name и AutomationProperties.HelpText класса FlyoutPage, либо свойство IconImageSource страницы Flyout.

На Android, чтобы задать текст средства чтения с экрана, который будет произноситься для выключателя в FlyoutPage, добавьте в проект 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>

Затем назначьте нужную строку свойству AutomationId в свойстве IconImageSource страницы Flyout:

var flyout = new ContentPage { ... };
flyout.IconImageSource.AutomationId = "btnMDPAutomationID";

ToolbarItem

На iOS, Android и UWP средства чтения с экрана будут произносить значение свойства Text экземпляров ToolbarItem при условии, что не заданы значения AutomationProperties.Name или AutomationProperties.HelpText.

На iOS и UWP значение свойства AutomationProperties.Name заменит значение Text, произносимое средством чтения с экрана.

На Android значения свойств AutomationProperties.Name и AutomationProperties.HelpText полностью заменят значение Text, являющееся отображаемым и одновременно произносимым средством чтения с экрана. Это является ограничением API-интерфейсов вплоть до уровня 26.