2012-06-23 7 views
19

¿Cuál es la diferencia entre:cuándo usar {x: Tipo ...}?

<Style TargetType="{x:Type Border}"> 

y:

<Style TargetType="Border"> 

¿Cuándo y por qué necesito utilizar el {x:Type …}?

+1

+1 buena pregunta. Creo que el segundo es una notación nueva y mejorada. – McGarnagle

+3

preguntas SO similares anteriores - http://stackoverflow.com/questions/1085730/difference-between-targettype-controltype-and-targettype-xtype-controltype/9128422#9128422 y http://stackoverflow.com/questions/ 5449481/performance-diff-between-target-sometype-and-target-xtype-sometype/9127377 # 9127377 – akjoshi

Respuesta

11

No hay diferencia en el efecto; en ambos casos la propiedad TargetType se establecerá en typeof(Border)

La primera versión {x:Type Border} que se necesitaba en la primera versión de WPF porque el compilador no hizo uso de la clase TypeConverter para convertir la cadena en un objeto de texto y que necesitaba para especificar el TypeExtension clase para hacer eso por ti.

La segunda versión se introdujo, si no recuerdo mal, con Silverlight y rápidamente encontró su camino hacia el compilador de WPF.

EDITAR

Mi hipótesis sobre la clase TypeConverter estaba mal; esto es implementado por el FrameworkElementFactory:

De the documentation:

tipo que apoyan typename-como-Cadena

WPF es compatible con las técnicas que permiten especificar el valor de algunos inmuebles del tipo Tipo sin requerir una x: extensión de marcado de tipo uso. En su lugar, puede especificar el valor como una cadena que nombra el tipo . Ejemplos de esto son ControlTemplate.TargetType y Style.TargetType. El soporte para este comportamiento no se proporciona a través del , ya sea que escriba convertidores o extensiones de marcado. En cambio, este es un comportamiento de diferimiento implementado a través de FrameworkElementFactory.

Silverlight admite una convención similar. De hecho, Silverlight no admite {x: Type} en su soporte de idioma XAML, y no acepta {x: Type} usos fuera de unas pocas circunstancias que son con la intención de admitir la migración WPF-Silverlight XAML. Por lo tanto, el comportamiento typename-as-string está incorporado en todas las evaluaciones de propiedades nativas de Silverlight donde el valor es Type.

1

Ambos son exactamente iguales. En cualquiera de los casos, su estilo se aplicará solo al Border.

2

Establecer esta propiedad (TargetType) en Border sin asignar el estilo con x:Key permite aplicar el estilo a todos los elementos del borde. Pero cuando establece el x:Key en {x:Type Border}, Esto significa que si le da al Style un valor x:Key de cualquier cosa que no sea {x:Type Border}, el Style no se aplicará a todos los elementos del Borde automáticamente. En su lugar, debe aplicar el estilo a los elementos del borde explícitamente.

4

Aunque en el ejemplo dado no hace ninguna diferencia, pero en realidad hay una diferencia entre x:Type y TypeName-as-String.

que he encontrado recientemente una situación que demuestra que x:Type es diferente de TypeName-as-String cuando se trata de tipos personalizados. Desde mi experiencia -

x:Type considera el nombre seguro o la versión de la asamblea (en la que reside tipo), pero no TypeName-as-String.

he explicado en mi escenario y otros detalles en mi blog aquí -

Importance of specifying AncestorType with x:Type in RelativeSourceBinding

Aparte de esto, también hay diferencia en la forma de WPF infiere el tipo. Para x:TypeTypeExtension se usa, mientras que para TypeName-as-StringFrameworkElementFactory se usa (como se menciona en Erno).

0

Si está utilizando XAML 2009, x: Key se puede especificar como un elemento, para admitir explícitamente diccionarios con clave por tipos de objeto que no sean cadenas sin la necesidad de una extensión de marcación intermedia. Consulte la sección "XAML 2009" en este tema. El resto de la sección Comentarios se aplica específicamente a la implementación de XAML 2006.

El valor de atributo de x: Key puede ser cualquier cadena definida en la Gramática XamlName o puede ser un objeto evaluado mediante una extensión de marcado. Consulte "Notas de uso de WPF" para obtener un ejemplo de WPF.

Los elementos hijo de un elemento primario que es una implementación de IDictionary generalmente deben incluir un atributo x: Key que especifica un valor clave único dentro de ese diccionario. Frameworks podría implementar propiedades de clave alias para sustituir x: Key en tipos particulares; los tipos que definen tales propiedades se deben atribuir a DictionaryKeyPropertyAttribute.

El código equivalente de especificar x: Key es la clave que se utiliza para el IDictionary subyacente. Por ejemplo, una x: clave que se aplica en el marcado para un recurso en WPF es equivalente al valor del parámetro de clave de ResourceDictionary.Add cuando agrega el recurso a un WPF ResourceDictionary en el código. La extensión de marcado x: Tipo tiene una función similar al operador typeof() en C# o el operador GetType en Microsoft Visual Basic.

La extensión de marcado x: Tipo proporciona un comportamiento de conversión de cadena para las propiedades que toman el tipo Tipo. La entrada es de tipo XAML. La relación entre el tipo de entrada XAML y el Tipo CLR de salida es que el Tipo de salida es el Tipo subyacente de la entrada XamlType, después de buscar el XamlType necesario según el contexto de esquema XAML y el servicio IXamlTypeResolver que proporciona el contexto.

En .NET Framework XAML Services, el manejo de esta extensión de marcado se define mediante la clase TypeExtension.

En implementaciones de marcos específicos, algunas propiedades que toman Tipo como valor pueden aceptar el nombre del tipo directamente (el valor de cadena del tipo Nombre). Sin embargo, implementar este comportamiento es un escenario complejo. Para ver ejemplos, consulte la sección "Notas de uso de WPF" a continuación.

La sintaxis de atributo es la sintaxis más común utilizada con esta extensión de marcado. El token de cadena proporcionado después de la cadena x: Type identifier se asigna como el valor de TypeName de la clase de extensión TypeExtension subyacente. En el contexto de esquema XAML predeterminado para .NET Framework XAML Services, que se basa en tipos CLR, el valor de este atributo es el Nombre del tipo deseado o contiene ese Nombre precedido por un prefijo para un mapeo de espacios de nombres XAML no predeterminado .

La extensión de marcado x: Tipo se puede usar en la sintaxis del elemento del objeto. En este caso, se requiere especificar el valor de la propiedad TypeName para inicializar correctamente la extensión.

La extensión de marcado x: Tipo también se puede utilizar como un atributo detallado; sin embargo, este uso no es típico:

+4

Si copia una prueba, debe proporcionar un enlace y/o dar crédito. –

+0

Ctrl + C, Ctrl + V detectado :) –

Cuestiones relacionadas