El título lo dice todo. A veces parece que los atributos Name
y x:Name
son intercambiables.
Entonces, ¿cuáles son las diferencias definitivas entre ellos y cuándo es preferible usar uno sobre el otro?
¿Hay implicaciones de rendimiento o memoria para usarlas de manera incorrecta?
.net
wpf
xaml
name-attribute
Drew Noakes
fuente
fuente
x:Name
todo el tiempo funciona bien. Simplemente tuve que cambiarlo, de loName
contrario no podría hacer referencia al control en mi código .xaml.cs, así que voy a suponer que ya no es el caso de que funcione bien todo el tiempo.Respuestas:
Realmente solo hay un nombre en XAML, el
x:Name
. Un marco de trabajo, como WPF, puede asignar opcionalmente una de sus propiedades a XAMLx:Name
mediante el uso deRuntimeNamePropertyAttribute
en la clase que designa una de las propiedades de las clases como asignación al atributo x: Name de XAML.La razón por la que se hizo esto fue para permitir marcos que ya tienen un concepto de "Nombre" en tiempo de ejecución, como WPF. En WPF, por ejemplo,
FrameworkElement
introduce una propiedad Name.En general, una clase no necesita almacenar el nombre para
x:Name
ser utilizable. Todos losx:Name
medios para XAML es generar un campo para almacenar el valor en el código detrás de la clase. Lo que hace el tiempo de ejecución con esa asignación depende del marco.Entonces, ¿por qué hay dos formas de hacer lo mismo? La respuesta simple es porque hay dos conceptos asignados en una propiedad. WPF quiere el nombre de un elemento preservado en tiempo de ejecución (que se puede usar a través de Bind, entre otras cosas) y XAML necesita saber a qué elementos desea que sean accesibles los campos en el código detrás de la clase. WPF une estos dos juntos marcando la propiedad Name como un alias de x: Name.
En el futuro, XAML tendrá más usos para x: Nombre, como permitirle establecer propiedades haciendo referencia a otros objetos por nombre, pero en 3.5 y anteriores, solo se usa para crear campos.
Si debe usar uno u otro es realmente una pregunta de estilo, no técnica. Dejaré eso a otros para una recomendación.
Consulte también AutomationProperties.Name VS x: Name , AutomationProperties.Name es utilizado por las herramientas de accesibilidad y algunas herramientas de prueba.
fuente
x:Name
porqueName
no crearía un campo para ser reconocido en código subyacente. Sin embargo, todavía no sé por qué sucede esto.Name
propiedad, significan lo mismo. Si el elemento no tiene unaName
propiedad, debe usarlox:Name
.No són la misma cosa.
x:Name
es un concepto xaml, usado principalmente para hacer referencia a elementos. Cuando le da a un elemento el atributo x: Name xaml, "lo especificado sex:Name
convierte en el nombre de un campo que se crea en el código subyacente cuando se procesa xaml, y ese campo contiene una referencia al objeto". ( MSDN ) Entonces, es un campo generado por el diseñador, que tiene acceso interno por defecto.Name
es la propiedad de cadena existente de aFrameworkElement
, listada como cualquier otra propiedad de elemento wpf en forma de un atributo xaml.Como consecuencia, esto también significa que
x:Name
se puede utilizar en una gama más amplia de objetos. Esta es una técnica para permitir que cualquier cosa en xaml sea referenciada por un nombre dado.fuente
x: Nombre y Nombre hacen referencia a diferentes espacios de nombres.
x: name es una referencia al espacio de nombres x definido por defecto en la parte superior del archivo Xaml.
Solo decir que Nombre usa el espacio de nombres predeterminado debajo.
x: Nombre dice usar el espacio de nombres que tiene el alias x . x es el valor predeterminado y la mayoría de las personas lo dejan, pero puedes cambiarlo a lo que quieras
entonces su referencia sería foo: nombre
Definir y usar espacios de nombres en WPF
OK, veamos esto de una manera diferente. Supongamos que arrastra y suelta un botón en su página Xaml. Puede hacer referencia a esto de 2 maneras x: nombre y nombre . Todos xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" y xmlns: x = "http://schemas.microsoft.com/winfx/2006/xaml" son referencias a múltiples espacios de nombres . Dado que xaml contiene el espacio de nombres Control (no 100% en eso) y la presentación contiene el FrameworkElement AND, la clase Button tiene un patrón de herencia de:
Entonces, como era de esperar, cualquier cosa que herede de FrameworkElement tendría acceso a todos sus atributos públicos. entonces, en el caso de Button, obtiene su atributo Name de FrameworkElement, en la parte superior del árbol de jerarquía. Entonces puede decir x: Name o Name y ambos accederán al getter / setter desde FrameworkElement.
Referencia de MSDN
WPF define un atributo CLR que consumen los procesadores XAML para asignar múltiples espacios de nombres CLR a un solo espacio de nombres XML. El atributo XmlnsDefinitionAttribute se coloca en el nivel de ensamblado en el código fuente que produce el ensamblaje. El código fuente del ensamblado WPF usa este atributo para asignar los diversos espacios de nombres comunes, como System.Windows y System.Windows.Controls, al http://schemas.microsoft.com/winfx/2006/xaml/presentation namespace.
Entonces los atributos de ensamblaje se verán así:
PresentationFramework.dll - XmlnsDefinitionAttribute:
fuente
http://schemas.microsoft.com/winfx/2006/xaml
poseeControl
ya que se puede utilizar directamente en XAML sin una 'x' espacio de nombres:<Control />
Ambas son lo mismo, muchos elementos de marco exponen una propiedad de nombre, pero para aquellos que no pueden usar x: name: generalmente solo me quedo con x: name porque funciona para todo.
Los controles pueden exponer el nombre como una Propiedad de dependencia si así lo desean (porque necesitan usar esa Propiedad de dependencia internamente), o pueden elegir no hacerlo.
Más detalles en msdn aquí y aquí :
fuente
X: El nombre puede causar problemas de memoria si tiene controles personalizados. Mantendrá una ubicación de memoria para la entrada NameScope.
Yo digo que nunca uses x: Nombre a menos que tengas que hacerlo.
fuente
FrameworkElement.RegisterName("elementname")
. Sin embargo, si lo llamaFrameworkElement.UnregisterName("elementname")
puede ser "desreferenciado".La única diferencia es que si está utilizando los controles de usuario en un control de Same Assembly, Name no identificará su control y obtendrá un error "Use x: Name para controles en el mismo ensamblaje". Entonces x: Nombre es el control de versiones WPF de los controles de nombres en WPF. El nombre solo se usa como Winform Legacy. Querían diferenciar los nombres de los controles en WPF y winforms ya que usan atributos en Xaml para identificar controles de otros ensamblados que usaron x: para Nombres de control.
Solo tenga en cuenta que no ponga un nombre para un control solo por mantenerlo, ya que reside en la memoria como un espacio en blanco y le dará una advertencia de que Nombre se ha aplicado para un control pero nunca se usa.
fuente
Nombre :
x: Nombre :
El uso de ambas directivas en XAML para un FrameworkElement o FrameworkContentElement provocará una excepción: si el XAML se compila de marcado, la excepción se producirá en la compilación de marcado, de lo contrario se produce en la carga.
fuente
x:Name
significa: crear un campo en el código detrás para contener una referencia a este objeto.Name
significa: establecer la propiedad de nombre de este objeto.fuente
Siempre uso la variante x: Nombre. No tengo idea si esto afecta el rendimiento, solo me resulta más fácil por la siguiente razón. Si tiene sus propios controles de usuario que residen en otro ensamblado, la propiedad "Nombre" no siempre será suficiente. Esto hace que sea más fácil pegar también la propiedad x: Name.
fuente
No es un elemento WPF sino un XML estándar y BtBh lo ha respondido correctamente, x se refiere al espacio de nombres predeterminado. En XML, cuando no prefija un elemento / atributo con un espacio de nombres, se supone que desea el espacio de nombres predeterminado. Entonces escribir simplemente
Name
no es más que una mano cortax:Name
. Puede encontrar más detalles sobre los espacios de nombres XML en el texto del enlacefuente
Una de las respuestas es que x: name debe usarse dentro de diferentes lenguajes de programa, como c #, y name debe usarse para el marco. Sinceramente, eso es lo que me suena.
fuente
El x: Name especificado se convierte en el nombre de un campo que se crea en el código subyacente cuando se procesa XAML, y ese campo contiene una referencia al objeto. En Silverlight, utilizando la API administrada, el proceso de creación de este campo se realiza mediante los pasos de destino de MSBuild, que también son responsables de unir las clases parciales para un archivo XAML y su código subyacente. Este comportamiento no se especifica necesariamente en lenguaje XAML; es la implementación particular que Silverlight aplica para usar x: Name en sus modelos de programación y aplicación.
Leer más en MSDN ...
fuente
Cuando declara un elemento Button en XAML, se refiere a una clase definida en tiempo de ejecución de Windows llamada Button.
El botón tiene muchos atributos, como fondo, texto, margen, ..... y un atributo llamado Nombre.
Ahora, cuando declaras un botón en XAML, es como crear un objeto anónimo que tiene un atributo llamado Nombre.
En general, no puede hacer referencia a un objeto anónimo, pero en el marco de trabajo WPF, el procesador XAML le permite referirse a ese objeto por cualquier valor que haya otorgado al atributo Name.
Hasta aquí todo bien.
Otra forma de crear un objeto es crear un objeto con nombre en lugar de un objeto anónimo. En este caso, el espacio de nombres XAML tiene un atributo para un objeto llamado Nombre (y dado que está en el espacio de nombres XAML, tiene X :) que puede configurar para que pueda identificar su objeto y consultarlo.
Conclusión:
Nombre es un atributo de un objeto específico, pero X: Nombre es un atributo de ese objeto (hay una clase que define un objeto general).
fuente
Mi investigación es
x:Name
como variable global . Sin embargo,Name
como variable local . ¿Eso significa x: Nombre que puede llamarlo en cualquier parte de su archivo XAML pero Nombre no lo es.Ejemplo:
No se puede
Binding
propiedadContent
deButton
con Nombre es "btn" porque fueraStackPanel
fuente