Pregunta

El título lo dice todo.A veces parece que el Name y x:Name Los atributos son intercambiables.

Entonces, ¿cuáles son las diferencias definitivas entre ellos y cuándo es preferible utilizar uno sobre el otro?

¿Hay alguna implicación en el rendimiento o la memoria por usarlos de manera incorrecta?

¿Fue útil?

Solución

En realidad sólo hay un nombre en XAML, el x:Name. Un marco, como WPF, puede asignar opcionalmente una de sus propiedades a x:Name de XAML utilizando el RuntimeNamePropertyAttribute en la clase que designa una de las propiedades clases como el mapeo a la x:. Nombre atributo de XAML

La razón de que esto se hizo fue para permitir marcos de trabajo 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 de x:Name para ser utilizable. Todo x:Name significa XAML es generar un campo para almacenar el valor en el código detrás de clase. Lo que el tiempo de ejecución hace con que la cartografía es dependiente de marco.

Así que, ¿por qué hay dos maneras de hacer la misma cosa? La respuesta simple es porque hay dos conceptos aplicados sobre una propiedad. WPF quiere que el nombre de un elemento conservado en tiempo de ejecución (que se puede utilizar a través del lazo, entre otras cosas) y XAML necesita saber cuáles son los elementos que desea ser accesible por los campos en el código detrás de clase. WPF vincula estos dos juntos marcando la propiedad Name como un alias de x:. Nombre

En el futuro, XAML tendrá más usos para x:. Nombre, tales como lo que le permite configurar las propiedades haciendo referencia a otros objetos por nombre, pero en 3.5 y anteriores, que sólo se utiliza para crear campos

Si se deben usar uno o el otro es realmente una cuestión de estilo, no técnico. Eso se lo dejo a los demás por una recomendación.

AutomationProperties.Name VS x: Nombre , AutomationProperties.Name es utilizado por la accesibilidad herramientas y algunas herramientas de prueba.

Otros consejos

No son la misma cosa.

x:Name es un concepto xaml, utilizado principalmente para hacer referencia a elementos. Cuando le das a un elemento del atributo x: xaml Nombre "el x:Name especificada 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." ( MSDN ) Por lo tanto, se trata de una diseñador generada campo, que tiene acceso interno por defecto.

Name es la propiedad de cadena existente de un FrameworkElement, catalogado como cualquier otra propiedad WPF elemento en forma de un atributo XAML.

Como consecuencia, esto también significa x:Name se puede utilizar en una amplia gama de objetos. Esta es una técnica para permitir que cualquier cosa en XAML para ser referenciado por un nombre dado.

x:Name y Name hacen referencia a diferentes espacios de nombres.

x:nombre es una referencia al espacio de nombres x definido de forma predeterminada en la parte superior del archivo Xaml.

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

Solo digo Nombre utiliza el espacio de nombres predeterminado debajo.

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

x:Nombre está diciendo usar el espacio de nombres que tiene el X alias.x es el valor predeterminado y la mayoría de la gente lo deja, pero puedes cambiarlo a lo que quieras

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

entonces tu referencia sería foo: nombre

Definir y utilizar espacios de nombres en WPF


Bien, veamos esto de otra manera.Supongamos que arrastra y suelta un botón en su página Xaml.Puedes hacer referencia a esto de 2 maneras. x:nombre y nombre.Todo 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.Desde xaml sostiene el Control espacio de nombres (no 100% en eso) y presentación sostiene el Elemento marco Y el Clase de botón tiene un patrón de herencia de:

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

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 jerárquico. Entonces puedes decir x:Nombre o Nombre y ambos accederán al captador/definidor desde FrameworkElement.

Referencia de MSDN

WPF define un atributo CLR que consumen los procesadores XAML para asignar varios espacios de nombres CLR a un único espacio de nombres XML.El AtributoDefiniciónXmlns El atributo se coloca en el nivel de ensamblado en el código fuente que produce el ensamblado.El código fuente del ensamblado de WPF utiliza este atributo para asignar los distintos espacios de nombres comunes, como System.Windows y System.Windows.Controls, al http://schemas.microsoft.com/winfx/2006/xaml/presentation espacio de nombres.

Entonces los atributos del ensamblaje se verán así:

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")]  

Los dos son la misma cosa, una gran cantidad de elementos del marco exponen un nombre de propiedad a sí mismos, pero para aquellos que no se puede utilizar x: nombre - por lo general sólo se pegan con x: nombre, ya que funciona para todo.

Los controles pueden exponer a nombre de sí mismos como una propiedad de dependencia si quieren (porque tienen que utilizar ese propiedades de dependencia internamente), o pueden optar por no hacerlo.

Más detalles en MSDN aquí y aquí :

  

Algunas aplicaciones a nivel de marco WPF   podría ser capaz de evitar cualquier uso de la   atributo x: Nombre, porque el nombre   propiedad de dependencia como se especifica   dentro del espacio de nombres de WPF para varios   de las clases base importantes, tales como   FrameworkElement / FrameworkContentElement   satisface este mismo propósito. Existen   Todavía algunos XAML y un marco común   escenarios donde el acceso a un código de   elemento que no tenía propiedad Name es   es necesario, sobre todo en ciertos   la animación y el apoyo del guión gráfico   clases. Por ejemplo, usted debe   especifique x: Nombre en líneas de tiempo y   creado transforma en XAML, si   la intención de hacer referencia a ellos desde el código.

     

Si nombre está disponible como una propiedad de   la clase, Nombre y x: Name se puede utilizar   indistintamente como atributos, sino una   de error se traducirá si ambos están   especificada en el mismo elemento.

X: Nombre puede causar problemas de memoria si tiene controles personalizados. Asimismo, mantendrá una posición de memoria para la entrada NameScope.

Nunca digo use x:. Nombre a menos que tenga a

La única diferencia es que si usted está usando los controles de usuario en un control de la misma Asamblea a continuación Nombre no identificará su control y obtendrá un error "Usar x: Name para los controles de la misma Asamblea". Así x: Name es el control de versiones de nombrar WPF controles en WPF. Nombre sólo se utiliza como un Winform Legacy. Ellos querían diferenciar la denominación de los controles en WPF y Windows Forms, ya que utilizan atributos en XAML para identificar los controles de otros montajes que utilizan x: para Nombres de control.

Hemos de tener en cuenta No ponga un nombre para un control por el simple hecho de mantener, ya que reside en la memoria como un espacio en blanco y se le dará un aviso de que se ha aplicado nombre para un control peros su nunca utilizado.

Nombre

  1. sólo se puede utilizar para los descendientes de FrameworkElement y FrameworkContentElement;
  2. se puede ajustar de código subyacente a través de FijarValor () y la propiedad similar.

x: Nombre

  1. puede ser utilizado para casi todos los elementos XAML;
  2. No se puede ajustar desde código subyacente a través de FijarValor (); que sólo se puede ajustar usando el atributo la sintaxis de los objetos, ya que es una directiva.

Con las dos directivas en XAML para uno FrameworkElement o FrameworkContentElement causará una excepción:. Si el XAML se compila de marcado, la excepción se producirá en el marcado compilar, de lo contrario se produce en la carga

x:Name significa: crear un campo en el código subyacente para almacenar una referencia a este objeto

.

Name significa: establecer la propiedad del nombre de este objeto

.

Yo siempre uso la x: Nombre variante. No tengo ni idea de si esto afecta a cualquier actuación, sólo resultará más fácil por la siguiente razón. Si usted tiene sus propios controles de usuario que residen en otro montaje sólo la propiedad "Nombre" no siempre es suficiente. Esto hace que sea más fácil sólo se adhieren también la x:. Propiedad Name

No es un tema de WPF, pero un estándar XML y una BtBh ha respondido correctamente, X se refiere al espacio de nombres predeterminado . En XML cuando no se anteponga un elemento / atributo con un espacio de nombres se supone que desea el espacio de nombres predeterminado. Por lo que escribir simplemente Name es nada más que una mano corta para x:Name. Más detalles sobre espacios de nombres XML se pueden encontrar en texto del enlace

Una de las respuestas es que x: es el nombre que se utilizará dentro de diferentes lenguajes de programación como C # y el nombre se va a utilizar para el marco. Francamente esto es lo que suena a mí.

Cuando se declara un elemento de botón en XAML se está refiriendo a una clase definida en las ventanas de tiempo de funcionamiento denominado botón.

El botón tiene muchos atribuyen como fondo, texto, margen, ..... y un atributo llamado Nombre.

Ahora, cuando se declara un botón en XAML es como crear un objeto anónimo que pasó a tener un atributo llamado Nombre.

En general no se puede hacer referencia a un objeto anónimo, pero en WPF XAML procesador de marco permite hacer referencia a ese objeto por cualquier valor que usted ha dado a atributo Name.

Hasta aquí todo bien.

Otra forma de crear un objeto es crear un objeto con nombre en lugar del objeto anónimo. En este espacio de nombres XAML caso tiene un atributo para un objeto denominado Nombre (y puesto que es en XAML espacio de nombres por lo tanto tienen X :) que puede configurar para que pueda identificar a su objeto y se refieren a ella.

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)

La especificada en x: Nombre 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, mediante la API administrada, el proceso de creación de este campo se lleva a cabo por las etapas de destino MSBuild, que también son responsables de la unión de las clases parciales para un archivo XAML y su código subyacente. Este comportamiento no es necesariamente XAML-idioma especificado; es la aplicación particular que se aplica al uso de Silverlight x:. Nombre en sus modelos de programación y de la aplicación

Leer más en MSDN ...

Mi investigación se x:Name como Global variable. Sin embargo, Name como locales variable. ¿Eso significa que x: Name se le puede llamar en cualquier parte de su archivo XAML, pero nombre no es
. Ejemplo:

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

No se puede Binding Content propiedad de Button con nombre es "btn" porque StackPanel fuera

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top