В WPF каковы различия между атрибутами x:Name и Name?
название говорит само за себя. Иногда кажется, что Name и x:Name атрибуты являются взаимозаменяемыми.
Итак, каковы окончательные различия между ними, и когда предпочтительнее использовать один над другим?
есть ли какие-либо последствия для производительности или памяти, чтобы использовать их неправильно?
14 ответов:
в XAML действительно есть только одно имя,
x:Name. Платформа, такая как WPF, может дополнительно сопоставить одно из своих свойств с XAMLx:Nameс помощьюRuntimeNamePropertyAttributeв классе, который обозначает одно из свойств класса как сопоставление с атрибутом x: Name XAML.причина, по которой это было сделано, заключалась в том, чтобы разрешить фреймворки, которые уже имеют понятие "имя" во время выполнения, такие как WPF. В WPF, например,
FrameworkElementвводит свойство Name.в общем, a класс не должен хранить имя для
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- Это концепция xaml, используемая в основном для ссылки на элементы. Когда вы даете элементу атрибут x: Name xaml, " указанныйx:Nameстановится именем поля, которое создается в базовом коде при обработке XAML, и это поле содержит ссылку на объект."( MSDN) Итак, это поле, созданное дизайнером, которое по умолчанию имеет внутренний доступ.
Name- это существующее строковое свойство aFrameworkElement, перечисленное как любое другое свойство элемента wpf в виде атрибута xaml.как следствие, это также означает
x:Nameможет использоваться на более широком диапазоне объектов. Это метод, позволяющий ссылаться на что-либо в xaml с помощью заданного имени.
x: имя и имя ссылаются на разные пространства имен.
x: имя - это ссылка на пространство имен x, определенное по умолчанию в верхней части файла Xaml.
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"просто говорю имя использует пространство имен по умолчанию ниже.
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"x: имя говорит использовать пространство имен, которое имеет x псевдоним. x-это значение по умолчанию, и большинство людей оставляют его, но вы можете изменить его на все, что вы как
xmlns:foo="http://schemas.microsoft.com/winfx/2006/xaml"так что ваша ссылка будет foo: name
определение и использование пространств имен в WPF
ок, давайте посмотрим на это иначе. Скажем, вы перетаскиваете кнопку на свою страницу Xaml. Вы можете ссылаться на это 2 способа x: имя и имя. Все xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" и xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - это ссылки на несколько пространств имен. Так как xaml держит управления пространство имен(не 100% на этом) и презентация держит FrameworkElement и класс имеет шаблон наследования:
Button : ButtonBase ButtonBase : ContentControl, ICommandSource ContentControl : Control, IAddChild Control : FrameworkElement FrameworkElement : UIElement, IFrameworkInputElement, IInputElement, ISupportInitialize, IHaveResourcesтак как можно было бы ожидать, что все, что наследуется от FrameworkElement будет иметь доступ ко всем его общественности атрибуты. поэтому в случае кнопки он получает свой атрибут Name из FrameworkElement, в самой верхней части дерева иерархии. так можно сказать x: имя или имя и они оба будут получать доступ к геттеру / сеттеру из FrameworkElement.
WPF определяет атрибут среды CLR, который используется процессорами XAML для сопоставления нескольких пространств имен среды CLR с одним пространством имен XML. Этот XmlnsDefinitionAttribute атрибут размещается на уровне сборки в исходном коде, который создает сборку. Исходный код сборки WPF использует этот атрибут для сопоставления различных общих пространств имен, такие как System.И системе Windows.Окна.Управление, к 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")]
Они оба одинаковы, многие элементы фреймворка сами предоставляют свойство name, но для тех, кто этого не делает, вы можете использовать x:name - я обычно просто придерживаюсь x:name, потому что он работает для всего.
элементы управления могут предоставлять имя себя как свойство зависимости, если они хотят (потому что они должны использовать это свойство зависимости внутренне), или они могут выбрать не делать.
подробнее в msdn здесь и здесь:
некоторые приложения уровня платформы WPF возможно, удастся избежать любого использования X: атрибут Name, потому что имя свойство зависимостей, как указано в пространстве имен WPF для нескольких из важных базовых классов, таких как FrameworkElement/FrameworkContentElement удовлетворяет этой же цели. Есть все еще некоторые общие XAML и рамки сценарии, в которых код доступа к элемент без имени свойство является необходимо, большинство в частности, в некоторых поддержка анимации и раскадровки занятия. Например, вы должны укажите x: имя в графиках времени и преобразования, созданные в XAML, если вы намерены ссылаться на них из кода.
Если имя доступно как свойство класс, имя и x: имя можно использовать попеременно как атрибуты, но ошибка возникает, если оба указано на том же элементе.
X: имя может вызвать проблемы с памятью, если у вас есть пользовательские элементы управления. Он сохранит место в памяти для записи NameScope.
Я говорю никогда не использовать x: имя, если вы не должны.
единственное различие заключается в том, что если вы используете пользовательские элементы управления в элементе управления из той же сборки, то имя не будет идентифицировать ваш элемент управления, и вы получите сообщение об ошибке "использовать x:имя для элементов управления в той же сборке". Итак, x: Name-это версия WPF для именования элементов управления в WPF. Имя просто используется как наследие Winform. Они хотели различать имена элементов управления в WPF и winforms, поскольку они используют атрибуты в Xaml для идентификации элементов управления из других сборок, которые они использовали x: для Имен элементов управления.
просто имейте в виду, не ставьте имя для элемента управления только ради сохранения его, поскольку он находится в памяти как пустой, и он даст вам предупреждение о том, что имя было применено для элемента управления, но его никогда не использовали.
имя:
- может использоваться только для потомков FrameworkElement и FrameworkContentElement;
- может быть установлен из кода позади через SetValue () и свойства, как.
x: Name:
- может использоваться практически для всех элементов XAML;
- не может быть установлен с code-behind через SetValue(); его можно установить только с помощью атрибута синтаксис на объектах, потому что это директива.
использование обеих директив в XAML для одного FrameworkElement или FrameworkContentElement вызовет исключение: если XAML компилируется разметкой, исключение будет возникать при компиляции разметки, в противном случае оно возникает при загрузке.
x:Nameозначает: создать поле в коде, чтобы хранить ссылку на этот объект.
Nameозначает: установите свойство name этого объекта.
Я всегда использую вариант x:Name. Я понятия не имею, влияет ли это на производительность, мне просто легче по следующей причине. Если у вас есть свои собственные usercontrols, которые находятся в другой сборке, просто свойство "Name" не всегда будет достаточно. Это упрощает просто придерживаться свойства x:Name.
это не элемент WPF, а стандартный XML и BtBh правильно ответил на него, x ссылается на пространство имен по умолчанию. В XML, когда вы не префикс элемента/атрибута с пространством имен он предполагает, что вы хотите пространство имен по умолчанию. Так что набрав просто
NameЭто не более чем сокращенная формаx:Name. Более подробную информацию о пространствах имен XML можно найти по адресу текст ссылки
один из ответов заключается в том, что x:name должен использоваться внутри разных языков программирования, таких как c#, и имя должно использоваться для фреймворка. Честно говоря, именно так это звучит для меня.
при объявлении элемента Button в XAML вы ссылаетесь на класс, определенный во время выполнения windows под названием Button.
кнопка имеет много атрибутов, таких как фон, текст, поля,..... и атрибут под названием Name.
теперь, когда вы объявляете кнопку в XAML, это похоже на создание анонимного объекта, который имел атрибут с именем Name.
В общем случае вы не можете ссылаться на анонимный объект, но в WPF framework XAML процессор позволяет обратитесь к этому объекту по любому значению, которое вы дали атрибуту Name.
пока все хорошо.
другой способ создать объект-это создать именованный объект вместо анонимного объекта. В этом случае пространство имен XAML имеет атрибут для объекта с именем Name (и поскольку он находится в пространстве имен XAML, поэтому имеет X:), который вы можете установить, чтобы вы могли идентифицировать свой объект и ссылаться на него.
вывод:
Name-это атрибут конкретного объекта, но X:Name-это один атрибут этого объекта (есть класс, который определяет общий объект).
указанного x: Name становится именем поля, которое создается в базовом коде при обработке XAML, и это поле содержит ссылку на объект. В Silverlight с помощью управляемого API процесс создания этого поля выполняется целевыми шагами MSBuild, которые также отвечают за объединение разделяемых классов для файла XAML и его кода программной части. Это поведение не обязательно задано на языке XAML; это конкретная реализация, которая В Silverlight применяется для использования x: Name в своих моделях программирования и применения.
мои исследования
x:Nameкак глобальные переменной. Однако,Nameкак local переменной. Означает ли это, что 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
Comments