Название говорит само за себя. Иногда кажется , что Name
и x:Name
атрибуты являются взаимозаменяемыми.
Итак, каковы окончательные различия между ними, и когда предпочтительнее использовать один над другим?
Есть ли какие-либо последствия для производительности или памяти при их неправильном использовании?
.net
wpf
xaml
name-attribute
Дрю Ноакс
источник
источник
x:Name
все время работает нормально. Мне просто нужно было изменить его,Name
иначе я не мог бы ссылаться на элемент управления в своем коде .xaml.cs, поэтому я собираюсь предположить, что это уже не тот случай, когда он работает постоянно.Ответы:
На самом деле в XAML есть только одно имя
x:Name
. Фреймворк, такой как WPF, может при желании отобразить одно из своих свойств в XAML,x:Name
используяRuntimeNamePropertyAttribute
класс on, который определяет одно из свойств классов как сопоставление атрибуту 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:Name
потомуName
что не будет создавать поле для распознавания в коде позади. Я до сих пор не знаю, почему это происходит.Name
свойство, они означают одно и то же. Если элемент не имеетName
свойства, вы должны использоватьx:Name
.Они не одно и то же.
x:Name
это концепция xaml, используемая в основном для ссылки на элементы. Когда вы даете элементу атрибут x: Name xaml, «указанноеx:Name
становится именем поля, которое создается в базовом коде при обработке xaml, и это поле содержит ссылку на объект». ( MSDN ) Итак, это поле, созданное дизайнером, по умолчанию имеющее внутренний доступ.Name
является существующим строковым свойством aFrameworkElement
, перечисленным как любое другое свойство элемента wpf в форме атрибута xaml.Как следствие, это также означает, что
x:Name
можно использовать более широкий спектр объектов. Это техника, позволяющая ссылаться на что-либо в xaml по заданному имени.источник
x: Имя и Имя ссылаются на разные пространства имен.
x: name - это ссылка на пространство имен x, определенное по умолчанию в верхней части файла Xaml.
Просто сказать, что имя использует пространство имен по умолчанию ниже.
x: Name говорит использовать пространство имен с псевдонимом x . х по умолчанию и большинство людей оставляют его, но вы можете изменить его на что угодно
поэтому ваша ссылка будет foo: name
Определить и использовать пространства имен в WPF
ОК, давайте посмотрим на это по-другому. Скажем, вы перетащите кнопку на свою страницу Xaml. Вы можете сослаться на это двумя способами x: name и name . Все xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" и xmlns: x = "http://schemas.microsoft.com/winfx/2006/xaml" являются ссылками на несколько пространств имен , Поскольку xaml содержит пространство имен Control (не на 100%), а презентация содержит FrameworkElement, а класс Button имеет шаблон наследования:
Таким образом, можно ожидать, что все, что наследуется от 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:
источник
http://schemas.microsoft.com/winfx/2006/xaml
имеет место ,Control
так как вы можете использовать его непосредственно в XAML без «х» Пространство имен:<Control />
Они оба - одно и то же, многие элементы фреймворка сами выставляют свойство name, но для тех, кто этого не делает, вы можете использовать x: name - я обычно просто придерживаюсь x: name, потому что оно работает для всего.
Элементы управления могут выставить имя как свойство зависимости, если они хотят (потому что им нужно использовать это свойство зависимости внутри страны), или они могут отказаться.
Более подробно в MSDN здесь и здесь :
источник
X: Имя может вызвать проблемы с памятью, если у вас есть пользовательские элементы управления. Он сохранит место в памяти для записи NameScope.
Я говорю, никогда не используйте x: Name, если нет необходимости.
источник
FrameworkElement.RegisterName("elementname")
. Однако, если вы позвоните,FrameworkElement.UnregisterName("elementname")
это может быть "разыменованным".Единственное отличие состоит в том, что если вы используете пользовательские элементы управления в элементе управления из той же сборки, то Name не будет идентифицировать ваш элемент управления, и вы получите ошибку «Использовать x: Name для элементов управления в той же сборке». Итак, x: Name - это версия управления именами в WPF для WPF. Имя просто используется в качестве Winform Legacy. Они хотели разграничить имена элементов управления в WPF и winforms, поскольку они используют атрибуты в Xaml для идентификации элементов управления из других сборок, которые они использовали x: для Имен элементов управления.
Просто имейте в виду, что не следует вводить имя для элемента управления только для того, чтобы сохранить его, поскольку оно хранится в памяти как пустое, и оно предупредит вас, что имя было применено к элементам управления, которые никогда не использовались.
источник
Имя :
x: имя :
Использование обеих директив в XAML для одного FrameworkElement или FrameworkContentElement вызовет исключение: если XAML компилируется с разметкой, исключение будет происходить при компиляции разметки, иначе это происходит при загрузке.
источник
x:Name
означает: создать поле в коде для хранения ссылки на этот объект.Name
означает: установить свойство name этого объекта.источник
Я всегда использую вариант x: Name. Я понятия не имею, влияет ли это на какую-либо производительность, мне просто легче по следующей причине. Если у вас есть собственные пользовательские элементы управления, которые находятся в другой сборке, просто свойства «Имя» не всегда будет достаточно. Это упрощает использование свойства x: Name.
источник
Это не элемент WPF, а стандартный XML, и BtBh правильно ответил на него, x относится к пространству имен по умолчанию. В XML, когда вы не добавляете элемент / атрибут к пространству имен, предполагается, что вам нужно пространство имен по умолчанию. Таким образом, печатать просто
Name
не больше, чем короткая рука дляx:Name
. Более подробную информацию о пространствах имен XML можно найти в тексте ссылкиисточник
Один из ответов заключается в том, что x: name должно использоваться в различных языках программирования, таких как c #, а name должно использоваться для платформы. Честно говоря, это то, что звучит для меня.
источник
Указанное x: Name становится именем поля, которое создается в базовом коде при обработке XAML, и это поле содержит ссылку на объект. В Silverlight, используя управляемый API, процесс создания этого поля выполняется целевыми шагами MSBuild, которые также отвечают за объединение частичных классов для файла XAML и его выделенного кода. Такое поведение не обязательно указано на языке XAML; это особая реализация, которую Silverlight применяет для использования x: Name в своих моделях программирования и приложений.
Подробнее на MSDN ...
источник
Когда вы объявляете элемент Button в XAML, вы ссылаетесь на класс, определенный в среде выполнения Windows, который называется Button.
Кнопка имеет много атрибутов, таких как фон, текст, поля ... и атрибут с именем.
Теперь, когда вы объявляете Button в XAML, это все равно, что создавать анонимный объект, который имеет атрибут Name.
Как правило, вы не можете ссылаться на анонимный объект, но в платформе WPF XAML-процессор позволяет вам ссылаться на этот объект по любому значению, которое вы задали для атрибута Name.
Все идет нормально.
Другой способ создать объект - создать именованный объект вместо анонимного объекта. В этом случае пространство имен XAML имеет атрибут для объекта с именем Name (и, поскольку он находится в пространстве имен XAML, таким образом, у вас есть X :), который вы можете установить, чтобы вы могли идентифицировать свой объект и ссылаться на него.
Вывод:
Имя - это атрибут определенного объекта, но X: Имя - это один атрибут этого объекта (есть класс, который определяет общий объект).
источник
Мое исследование
x:Name
как глобальная переменная. Однако,Name
как локальная переменная. Означает ли это, что x: Name, вы можете вызывать его где угодно в вашем файле XAML, но Name - нет.Пример:
Вы не можете
Binding
свойствоContent
изButton
с названием является «BTN» , потому что за пределамиStackPanel
источник