C# WPF03 декабря

C# WPF отличие Name от x:Name

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().

 

Теги: #с#, #wpf, #си шарп

Комментарии

Добавить комментарий:

Отметьте что вы не робот

Вернуться наверх