C# WPF03 декабря
x:Name отвечает за то, чтобы вы могли сослаться на это имя в вашем code-behind, а также за привязку по ElementName.
В XAML-атрибут Name, как и все остальные атрибуты без x:, устанавливает значение свойства Name.
В WPF вшита магия, которая выполняет и то, и другое, когда вы укажете любой из атрибутов.
Резюме:
Отличие при нормальных сценариях использования чисто теоретическое, можно не обращать внимание.
Более длинный ответ.
Атрибуты в пространстве имён WPF отображаются на свойства WPF-объектов (наподобие Grid).
Поскольку базовые типы WPF-классов (например, FrameworkElement) содержат dependency property Name, указание этого атрибута возможно для всех WPF-классов.
Атрибуты в пространстве имён XAML (которое обычно кодируется алиасом x) относятся к атрибутам XAML-тегов.
Они несут специальный XAML-специфический смысл.
В частности, x:Name задаёт XAML-имя внутри текущего NameScope.
При обычном сценарии использования XAML (компиляция XAML-файла с build action = Page) атрибуты x:Name превращаются в поле объемлющего класса, которое в методе InitializeComponent инициализируется ссылкой на WPF-объект, сконструированный из XAML-тега с этим атрибутом.
Кроме того, XAML-имя используется для поиска ElementName для Binding'ов: связи типа ElementName разрешаются на этапе компиляции.
Для избежания противоречий и ошибок, было решено, что обе декларации действуют одинаково: во время компиляции XAML любой из Name и x:Name выполняет обе роли: устанавливает dependency property Name, и создаёт поле в объемлющем классе и его привязку.
Заметьте, что связь между x:Name
и Name
существует лишь постольку, поскольку она поддерживается фреймворком WPF.
Заметьте, что даже некомпилированный XAML, загружаемый WPF, регистрирует значения x:Name
в NameScope
(так как это значение потенциально важно для Binding
ElementName
), но в этом случае не будет выполнена кастомная привязка к полям объекта, выполняемая обычно в InitializeComponent()
.
Ваш комментарий успешно добавлен.
После проверки комментарий будет опубликован на сайте.