#wpf
В чем заключается отличение Name от x:Name?
Ответы
Ответ 1
Резюме: Хороший вопрос. Отличие при нормальных сценариях использования чисто теоретическое, можно не обращать внимание. Более длинный ответ. x:Name отвечает за то, чтобы вы могли сослаться на это имя в вашем code-behind, а также за привязку по ElementName. XAML-атрибут Name, как и все остальные атрибуты без x:, устанавливает значение свойства Name. В WPF вшита магия, которая выполняет и то, и другое, когда вы укажете любой из атрибутов. Ответ со всеми подробностями. Атрибуты в пространстве имён WPF (то есть, в пространстве имён httр://schemas.microsoft.com/winfx/2006/xaml/presentation) (которое обычно является пространством имён по умолчанию), отображаются на свойства WPF-объектов (наподобие Grid). Поскольку базовые типы WPF-классов (например, FrameworkElement) содержат dependency property Name, указание этого атрибута возможно для всех WPF-классов. Атрибуты в пространстве имён XAML (httр://schemas.microsoft.com/winfx/2006/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, и создаёт поле в объемлющем классе и его привязку. Для того, чтобы задать эту связь, используется RuntimeNamePropertyAttribute. Вы можете, переопределив этот атрибут, назначить для x:Name другое свойство. В принципе возможны сценарии, в которых в XAML "попадёт" объект, не имеющий свойства Name и атрибута RuntimeNamePropertyAttribute. В этом случае, понятно, будет работать только x:Name. Например, объекты типа Storyboard или Transform не порождены от FrameworkElement/FrameworkContentElement и не имеют свойства Name, тем не менее, указав x:Name для них, вы сможете сослаться на них в code-behind. Заметьте, что связь между x:Name и Name существует лишь постольку, поскольку она поддерживается фреймворком WPF. Заметьте, что даже некомпилированный XAML, загружаемый WPF, регистрирует значения x:Name в NameScope (так как это значение потенциально важно для Binding ElementName), но в этом случае не будет выполнена кастомная привязка к полям объекта, выполняемая обычно в InitializeComponent().
Комментариев нет:
Отправить комментарий