Свойства автоматизации в Xamarin.Forms
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
либо объединения этих значений.
Каждая платформа имеет отдельное средство чтения с экрана для озвучивания значений специальных возможностей:
- В iOS есть VoiceOver. Дополнительные сведения см. в статье Тестирование специальных возможностей на устройстве с использованием VoiceOver на сайте developer.apple.com.
- В Android есть TalkBack. Дополнительные сведения см. в статье Тестирование специальных возможностей приложения на сайте developer.android.com.
- В Windows есть экранный диктор. Дополнительные сведения см. в статье Проверка основных сценариев приложения с использованием экранного диктора.
Однако точное поведение средства чтения с экрана зависит от программного обеспечения и его настройки пользователем. Например, большинство средств чтения с экрана зачитывают текст с элемента управления, когда на него переключается фокус, что позволяет пользователям ориентироваться при переходе между элементами управления на странице. Некоторые средства чтения с экрана также считывают весь пользовательский интерфейс приложения при отображении страницы, что позволяет пользователю получить все доступные на странице сведения, прежде чем пытаться перемещаться по ней.
Кроме того, средства чтения с экрана зачитывают разные значения специальных возможностей. В рассматриваемом примере приложения:
- 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);
Особенности специальных возможностей
Следующие разделы описывают особенности настройки специальных возможностей у определенных элементов управления.
NavigationPage
На 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.