AutomationProperties.Name VS x: Name

Для "CodedUI test builder" между AutomationProperties.Name и x:Name нет разницы. Но первый может переопределить второй. Также AtomationProperties.Name поддерживает привязку данных, x:Name, конечно, не делает.

Как мы знаем, если вы используете шаблон MVVM, лучше всего использовать x:Name при необходимости.

Итак, если AutomationProperties.Name предпочтительнее x:Name?

Ответ 1

Резюме

x:Name и AutomationProperties.Name - две совершенно разные вещи, поэтому вопрос "следует использовать тот или иной" основан на ложной предпосылке: в общем, вы не можете использовать тот или иной.

Цель x:Name состоит в том, чтобы идентифицировать элемент управления WPF в коде, чтобы разработчик мог получить к нему доступ. Это не имеет смысла (или уникально) вне сферы действия класса, который моделирует определенный элемент WPF.

С другой стороны, целью AutomationProperties.Name является идентификация элемента пользовательского интерфейса в контексте диалогового окна или другого типа окна, которое представляется пользователю для взаимодействия. В частности, его значение должно соответствовать тому, что пользователь будет воспринимать как "метку" этого элемента пользовательского интерфейса (так, чтобы, например, инструмент доступности мог информировать пользователя о цели этого элемента).

Хотя любой инструмент (такой как компилятор XAML) может использовать значение x:Name для AutomationProperties.Name, также не означает, что он должен что-то делать; ИМХО это именно тот тип "удобства", который приводит к проблемам, потому что разница между ними скрыта от разработчика, поэтому неизменно одно или другое свойство будет иметь семантически неправильное значение.

Информация о семантических и технических аспектах каждого из свойств приведена в следующих разделах.

х: Name

В документации MSDN объясняется, что

После того, как x: Имя применяется к модели программирования резервной структуры, имя эквивалентно переменной, которая содержит ссылку на объект или экземпляр, возвращаемый конструктором.

Значение использования директивы x: Name должно быть уникальным в XAML NameScope.

[...]

В стандартной конфигурации сборки для приложения WPF, которое использует XAML, частичные классы и код, указанное x: Name становится имя поля, которое создается в базовом коде, когда XAML обрабатывается заданием сборки компиляции разметки, и это поле выполняется ссылка на объект.

Из сказанного выше можно сказать, что x:Name:

  • используется для доступа к элементу в коде (не XAML), так как он управляет именем поля, которое содержит элемент
  • должен быть уникальным в XAML namescope (так как вы не можете иметь два поля с тем же именем в коде)

AutomationProperties.Name

документация доступности WPF объясняет, что

Имя элемента автоматизации назначается разработчиком. Свойство Name всегда должно соответствовать тексту ярлыка на экран. Например, имя должно быть "Browse..." для элемента кнопки с меткой "Browse...".