Ответ 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...".