В чем разница между атрибутами x: Name и Name в WPF?

Иногда кажется , что Name и x:Name атрибуты являются взаимозаменяемыми.

Итак, каковы окончательные различия между ними, и когда предпочтительнее использовать одно перед другим?

Есть ли какие-либо последствия для производительности или памяти при их неправильном использовании?

Ответов (15)

Решение

На самом деле в XAML есть только одно имя - x:Name . Платформа, такая как WPF, может дополнительно сопоставить одно из своих свойств с XAML, x:Name используя RuntimeNamePropertyAttribute класс, который обозначает одно из свойств классов как сопоставление с атрибутом x: Name XAML.

Причина, по которой это было сделано, заключалась в том, чтобы позволить фреймворкам, которые уже имеют понятие «Имя» во время выполнения, например WPF. В WPF, например, FrameworkElement вводится свойство Name.

Как правило, для использования класса не требуется хранить имя x:Name . Все x:Name средства для XAML - это создание поля для хранения значения в коде класса. То, что среда выполнения делает с этим отображением, зависит от платформы.

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

В будущем XAML будет больше использовать для x: Name, например, позволяя вам устанавливать свойства, ссылаясь на другие объекты по имени, но в 3.5 и более ранних версиях он используется только для создания полей.

Следует ли вам использовать тот или иной вариант - вопрос стиля, а не технический. Я оставлю это другим для рекомендации.

См. Также AutomationProperties.Name VS x: Name , AutomationProperties.Name используется инструментами специальных возможностей и некоторыми инструментами тестирования.

Единственное отличие состоит в том, что если вы используете пользовательские элементы управления в элементе управления из той же сборки, имя не будет идентифицировать ваш элемент управления, и вы получите сообщение об ошибке «Использовать x: имя для элементов управления в той же сборке». Итак, x: Name - это версия WPF для элементов управления именами в WPF. Имя просто используется как наследие Winform. Они хотели различать наименования элементов управления в WPF и winforms, поскольку они используют атрибуты в Xaml для идентификации элементов управления из других сборок, которые они использовали x: для имен элементов управления.

Просто имейте в виду, что не указывайте имя для элемента управления только для того, чтобы сохранить его, поскольку он находится в памяти как пробел, и он выдаст вам предупреждение о том, что имя было применено к элементу управления, но никогда не использовалось.

Имя :

  1. может использоваться только для потомков FrameworkElement и FrameworkContentElement;
  2. может быть установлен из кода программной части через SetValue () и аналогично свойствам.

x: Имя :

  1. может использоваться почти для всех элементов XAML;
  2. НЕ может быть установлен из кода программной части через SetValue (); его можно установить только с помощью синтаксиса атрибутов для объектов, потому что это директива.

Использование обеих директив в XAML для одного FrameworkElement или FrameworkContentElement вызовет исключение: если XAML скомпилирован по разметке, исключение произойдет при компиляции разметки, в противном случае это произойдет при загрузке.

Один из ответов заключается в том, что x: name должно использоваться в разных языках программирования, таких как C#, а name должно использоваться для фреймворка. Честно говоря, это то, как мне кажется.

Когда вы объявляете элемент Button в XAML, вы имеете в виду класс, определенный во время выполнения Windows, который называется Button.

Кнопка имеет множество атрибутов, таких как фон, текст, поля ... и атрибут с именем Name.

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

В общем, вы не можете ссылаться на анонимный объект, но в WPF framework XAML процессор позволяет вам ссылаться на этот объект по любому значению, которое вы дали атрибуту Name.

Все идет нормально.

Другой способ создать объект - создать именованный объект вместо анонимного объекта. В этом случае пространство имен XAML имеет атрибут для объекта с именем Name (и поскольку он находится в пространстве имен XAML, следовательно, имеет X :), который вы можете установить, чтобы вы могли идентифицировать свой объект и ссылаться на него.

Заключение:

Имя - это атрибут определенного объекта, но X: Name - это один из атрибутов этого объекта (существует класс, который определяет общий объект).

x:Name означает: создать поле в коде позади для хранения ссылки на этот объект.

Name означает: установить свойство name этого объекта.

Мои исследования - x:Name это глобальная переменная. Однако Name как локальная переменная. Означает ли это, что x: Name вы можете называть его в любом месте вашего XAML-файла, а Name - нет.
Пример:

<StackPanel>
<TextBlock Text="{Binding Path=Content, ElementName=btn}" />
<Button Content="Example" Name="btn" />
</StackPanel>
<TextBlock Text="{Binding Path=Content, ElementName=btn}" />

Вы не можете Binding свойство Content из Button с названием является «BTN» , потому что за пределами StackPanel

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

Это не элемент WPF, а стандартный элемент XML, и BtBh правильно ответил на него, x относится к пространству имен по умолчанию. В XML, когда вы не добавляете к элементу / атрибуту префикс пространства имен, предполагается, что вам нужно пространство имен по умолчанию. Так что набор текста Name - это не более чем короткая рука x:Name . Более подробную информацию о пространствах имен XML можно найти в тексте ссылки.

Это одно и то же, многие элементы фреймворка сами предоставляют свойство name, но для тех, кто этого не делает, вы можете использовать x: name - я обычно просто придерживаюсь x: name, потому что он работает для всего.

Элементы управления могут отображать имя как свойство зависимости, если они хотят (потому что им нужно использовать это свойство зависимости внутри), или они могут решить не делать этого.

Подробнее в msdn здесь и здесь :

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

Если Name доступно как свойство класса, Name и x: Name могут использоваться как атрибуты взаимозаменяемо, но если оба они указаны в одном элементе, возникнет ошибка.

Я всегда использую вариант x: Name. Я понятия не имею, влияет ли это на производительность, мне это проще по следующей причине. Если у вас есть собственные пользовательские элементы управления, которые находятся в другой сборке, просто свойства «Имя» не всегда будет достаточно. Это упрощает использование свойства x: Name.

x: Name и Name ссылаются на разные пространства имен.

x: name - это ссылка на пространство имен x, определенное по умолчанию в верхней части файла Xaml.

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Просто говоря, имя использует пространство имен по умолчанию ниже.

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

x: Name говорит об использовании пространства имен с псевдонимом x . x - значение по умолчанию, и большинство людей оставляют его, но вы можете изменить его на все, что захотите

xmlns:foo="http://schemas.microsoft.com/winfx/2006/xaml"

так что ваша ссылка будет foo: name

Определение и использование пространств имен в WPF


Хорошо, давайте посмотрим на это по-другому. Допустим, вы перетаскиваете кнопку на свою страницу Xaml. Вы можете ссылаться на это двумя способами x: имя и имя . Все xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" и xmlns: x = "http://schemas.microsoft.com/winfx/2006/xaml" являются ссылками на несколько пространств имен . Поскольку xaml содержит пространство имен Control (не 100% в этом случае), а презентация содержит FrameworkElement, И класс Button имеет шаблон наследования:

Button : ButtonBase
ButtonBase : ContentControl, ICommandSource
ContentControl : Control, IAddChild
Control : FrameworkElement
FrameworkElement : UIElement, IFrameworkInputElement, 
                    IInputElement, ISupportInitialize, IHaveResources

Итак, как и следовало ожидать, все, что наследует от FrameworkElement, будет иметь доступ ко всем своим общедоступным атрибутам. поэтому в случае Button он получает свой атрибут Name из FrameworkElement на самом верху дерева иерархии. Таким образом, вы можете сказать x: Name или Name, и они оба будут обращаться к геттеру / сеттеру из FrameworkElement.

Справочник MSDN

WPF определяет атрибут CLR, который используется процессорами XAML для сопоставления нескольких пространств имен CLR с одним пространством имен XML. XmlnsDefinitionAttribute атрибут помещается на уровне сборки в исходном коде , который производит сборку. Исходный код сборки WPF использует этот атрибут для сопоставления различных общих пространств имен, таких как System.Windows и System.Windows.Controls, с пространством имен http://schemas.microsoft.com/winfx/2006/xaml/presentation .

Таким образом, атрибуты сборки будут выглядеть примерно так:

PresentationFramework.dll - XmlnsDefinitionAttribute:

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Data")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Navigation")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Shapes")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Documents")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Controls")]  

Это не одно и то же.

x:Name - это концепция xaml, используемая в основном для ссылки на элементы. Когда вы даете элементу атрибут xaml x: Name, «указанное x:Name становится именем поля, которое создается в базовом коде при обработке xaml, и это поле содержит ссылку на объект». ( MSDN ) Итак, это поле, созданное дизайнером, которое по умолчанию имеет внутренний доступ.

Name - это существующее строковое свойство элемента a FrameworkElement, указанное как любое другое свойство элемента wpf в форме атрибута xaml.

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

X: Name может вызвать проблемы с памятью, если у вас есть настраиваемые элементы управления. Он сохранит место в памяти для записи NameScope.

Я говорю, никогда не используйте x: Name, если вам не нужно.

Указанный x: Name становится именем поля, которое создается в базовом коде при обработке XAML, и это поле содержит ссылку на объект. В Silverlight с использованием управляемого API процесс создания этого поля выполняется целевыми шагами MSBuild, которые также отвечают за объединение частичных классов для файла XAML и его кода программной части. Это поведение не обязательно указывается на языке XAML; это конкретная реализация, которую Silverlight применяет для использования x: Name в своих моделях программирования и приложений.

Подробнее на MSDN ...