2010-12-13 10 views
45

¿Cuál es la diferencia entre x:Key y x:Name en WPF?¿Cuál es la diferencia entre x: Key y x: Nombre en WPF?

No estoy seguro de cuál es la verdadera diferencia.

+1

@Alastair, la pregunta que enumeró como posible víctima no está relacionada con esto. – Josh

+1

¿cómo es un duplicado? La otra pregunta habla de 'Nombre' vs' Tipo'. Esta pregunta se trata de 'Key' vs' Name'. – jalf

+0

Mi error, leí mal la pregunta de "posible engaño". Disculpas –

Respuesta

43

Aunque se utilizan para fines similares, no son intercambiables. x: la clave se usa para elementos que se agregan como valores a un diccionario, con mayor frecuencia para estilos y otros recursos que se agregan a ResourceDictionary. Al establecer el atributo x: Key, en realidad no hay una propiedad correspondiente en el objeto o incluso una propiedad de dependencia adjunta que se está configurando. Simplemente lo utiliza el procesador XAML para saber qué tecla usar al llamar a Dictionary.Add.

x: El nombre es un poco más complicado. Se usa para aplicar un nombre asociado a un objeto (generalmente un objeto derivado de FrameworkElement) dentro del alcance de algún elemento principal. Este ámbito se denomina "namescope" y la manera más fácil de pensarlo es imaginar un UserControl que contenga un <TextBox x:Name="foo" />.

Puede colocar varias instancias del UserControl en una ventana sin que el nombre "foo" colisione porque cada UserControl tiene su propio namescope.

Vale la pena señalar también que FrameworkElement define una propiedad de dependencia llamada Name que es equivalente a establecer x: Name.

La otra diferencia es que el diseñador de XAML crea miembros en el código subyacente para los elementos que tienen una x: Nombre. Esto no es así para los objetos agregados a un diccionario usando x: Key.

Puede encontrar más información sobre esto en la sección de comentarios de la documentación de MSDN para the x:Name directive.

20

x: La clave solo es válida en el ámbito de un elemento ResourceDictionary. x: Key se usa como el identificador primario para los elementos en ResourceDictionary.

Por otro lado, x: Name es válido en el alcance de todo menos un ResourceDictionary. x: La clave no es válida fuera del alcance de ResourceDictionary.

Cuestiones relacionadas