Поделиться через


Директива x:Name

Уникально идентифицирует определенные XAML элементы в диапазоне имен XAML. Диапазоны имен XAML и соответствующие модели уникальности могут применяться к объектам, для которых созданы экземпляры, если платформы предоставляют API или поведения реализации, осуществляющие во время выполнения доступ к графам объектов, созданным XAML.

Использование атрибута XAML

<object x:Name="XAMLNameValue".../>

Значения XAML

XAMLNameValue

Строка, которая соответствует ограничениям Грамматика XamlName.

Заметки

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

Значение директивы x:Name необходимо использовать уникально в пределах пространства имен XAML. По умолчанию при использовании API-интерфейсом служб XAML платформы .NET Framework первичная область видимости имен определяется в корневом элементе XAML одного производства XAML и охватывает все элементы, содержащиеся в данном производстве XAML. Дополнительные дискретные области видимости имен XAML, которые могут иметь место в пределах одного производства XAML, могут определяться платформами для конкретных сценариев. Например, в WPF определяются и создаются новые области имен XAML с использованием любого шаблона, который также определен в этой рабочей среде XAML. Дополнительные сведения об областях имен XAML (предназначенных для WPF, но относящихся ко многим концепциям областей имен XAML) см. в разделе Области видимости имен XAML в WPF.

Обычно не следует применять x:Name в ситуациях, в которых также используется x:Key. В реализациях XAML посредством конкретных существующих платформ были представлены понятия подстановки между x:Key и x:Name, но это не рекомендуется. Службы XAML платформы .NET Framework не поддерживают такие концепции подстановки при обработке сведений об именах и ключах, например INameScope или DictionaryKeyPropertyAttribute.

Правила для разрешения x:Name, а также принудительное применение уникальность имени потенциально определяются конкретными реализациями платформ. Однако, чтобы использоваться в службах XAML .NET Framework, определения платформы уникальности пространства имен XAML должны быть согласованы с определением сведений INameScope в этом документе, и должны использовать те же правила относительно области применения сведений. Например, в реализации Windows Presentation Foundation (WPF) различные элементы разметки разбиваются на отдельные диапазоны NameScope, например словари ресурсов, логическое дерево, созданное XAML уровня страниц, шаблоны и другое отложенное содержимое, а затем обеспечивается уникальность имени XAML в каждой из этих областей видимости имен XAML.

Для настраиваемых типов, использующих модули записи объектов XAML служб XAML платформы .NET Framework, можно задать или изменить свойство, сопоставленное x:Name типа. Это поведение определяется ссылкой на имя свойства для сопоставления атрибуту RuntimeNamePropertyAttribute в коде определения типа. RuntimeNamePropertyAttribute — это атрибут уровня типа.

Используя службы XAML .NET Framework, логика поддержки областей видимости XAML может быть определена нейтральным по отношению к платформе способом путем реализации интерфейса INameScope.

Примечания об использовании WPF

В стандартной конфигурации построения для приложения WPF, в котором используется XAML, разделяемые классы и файлы кода программной части, заданный атрибут x:Name становится именем поля, которое создается в основном коде при обработке XAML задачей построения компиляции с разметкой, и в этом поле содержится ссылка на объект. По умолчанию созданное поле является внутренним. Чтобы изменить уровень доступа к полю, задайте атрибут x:FieldModifier. В WPF и Silverlight последовательность следующая: компиляция разметки определяет и задает имя полю в разделяемом классе, но значение изначально пусто. Затем созданный метод с именем InitializeComponent вызывается из конструктора классов. InitializeComponent состоит из вызовов FindName, использующих каждое значение x:Name, которое существует в определенной XAML части разделяемого класса в виде строк входных данных. Возвращаемые значения затем назначаются ссылке одноименного поля для заполнения значений полей с объектами, которые были созданы в результате синтаксического анализа XAML. Исполнение InitializeComponent позволяют ссылаться на граф объекта во время выполнения с помощью x:Name / поля имя непосредственно, вместо того чтобы вызвать FindName каждый раз, когда вам нужна ссылка на объект, определенный XAML.

Для приложения WPF, в котором используются конечные файлы Microsoft Visual Basic и содержатся файлы XAML с действием построения Page, при компиляции создается отдельное свойство ссылки, которое добавляет ключевое слово WithEvents ко всем элементам, имеющим атрибут x:Name, что обеспечивает поддержку синтаксиса Handles для делегатов обработчика событий. Это свойство всегда является открытым. Дополнительные сведения см. в разделе Обработка событий в Visual Basic и WPF.

x:Name используется обработчиком WPF XAML для регистрации имени в диапазоне имен XAML во время загрузки даже в случаях, когда страница не компилируется с разметкой в результате действий построения (например, свободный XAML словаря ресурсов). Одна из причин такого поведения — что атрибут x:Name может использоваться для привязки свойства ElementName. Дополнительные сведения см. в разделе Общие сведения о связывании данных.

Как было сказано ранее, не следует применять x:Name (или Name) в ситуациях, в которых также используется x:Key. WPF ResourceDictionary обладает особым поведением при определении себя в области видимости имен XAML, однако возвращает значение Not Implemented или NULL для ключевых API INameScope, как способ принудительно реализовать это поведение. Если средство синтаксического анализа XAML WPF встречает Name или x:Name в определенном XAML ResourceDictionary, имя не добавляется ни в одну из областей видимости имен XAML. При попытке найти это имя из любой области видимости имен XAML методы FindName не возвратят допустимые результаты.

x:Name и Name

Во многих сценариях приложений WPF можно не использовать атрибут x:Name, поскольку для аналогичных целей используется свойство зависимостей Name, заданное в пространстве имен XAML по умолчанию для нескольких важных базовых классов, таких как FrameworkElement и FrameworkContentElement. Есть еще некоторые распространенные сценарии WPF и XAML, где имеет важное значение доступ к элементу из кода, без свойства Name на уровне платформы. Например, некоторые классы поддержки анимацию и раскадровки не поддерживают свойство Name, однако для управления анимацией на них часто необходимо ссылаться в коде. Необходимо задать x:Name в качестве атрибута временных шкал и преобразований, создаваемых в XAML, если требуется впоследствии ссылаться на них из кода.

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

Свойство Name можно задать с использованием синтаксиса атрибутов XAML и в коде с помощью SetValue; тем не менее обратите внимание, что задание свойства Name в коде не создает ссылку на репрезентативное поле в пространстве имен XAML в большинстве случае, когда код XAML уже загружен. Вместо того, чтобы задавать в коде значение свойства Name, вызовите в коде методы NameScope для соответствующей области видимости имен.

Name также может быть установлено с использованием синтаксиса элемента свойства с внутренним текстом, но это редко. x:Name, наоборот, нельзя задать в синтаксисе элементов свойств XAML или в коде с помощью SetValue; его можно задать только с помощью синтаксиса атрибутов в объектах, поскольку это директива.

Заметки об использовании Silverlight.

x:Name для Silverlight описывается отдельно. Дополнительные сведения см. в разделе Возможности пространства имен языка XAML (x:) (Silverlight).

См. также

Ссылки

FrameworkElement.Name

FrameworkContentElement.Name

Основные понятия

Деревья в WPF