.net - img - meta tags html5
¿Cuándo usar{x: Type...}? (5)
Cuál es la diferencia entre:
<Style TargetType="{x:Type Border}">
y:
<Style TargetType="Border">
¿Cuándo y por qué necesito usar el {x:Type …}
?
Ambos son exactamente iguales. En cualquiera de los casos, su estilo se aplicará solo al Border
.
Aunque en el ejemplo dado no hay diferencia, pero en realidad hay una diferencia entre x:Type
y TypeName-as-String
.
Recientemente he encontrado una situación que muestra que x:Type
es diferente de TypeName-as-String
cuando se trata de tipos personalizados. Por mi experiencia -
x:Type
considera el nombre TypeName-as-String
o la versión del ensamblaje (en el que reside el tipo) pero no TypeName-as-String
.
He explicado acerca de mi escenario y otros detalles en mi blog aquí.
Importancia de especificar AncestorType con x: Escriba RelativeSourceBinding
Aparte de esto, también hay una diferencia en cómo WPF infiere el tipo. Para x:Type
se usa TypeExtension
, mientras que para TypeName-as-String
se usa FrameworkElementFactory
(como se mencionó en Erno).
Establecer esta propiedad ( TargetType
) en Borde sin asignar el estilo con una x:Key
permite que el estilo se aplique a todos los elementos de borde. Pero cuando establece la x:Key
en {x:Type Border}
, esto significa que si le asigna al Style
una x:Key
Valor x:Key
de cualquier otra cosa que no sea {x:Type Border}
, el Style
no se aplicará a todos los elementos de borde automáticamente. En su lugar, debe aplicar el estilo a los elementos de borde explícitamente.
No hay diferencia en efecto; en ambos casos, la propiedad TargetType se establecerá en typeof(Border)
La primera versión {x:Type Border}
era necesaria en la primera versión de WPF porque el compilador no usaba la clase TypeConverter
para convertir la cadena en un objeto Type y necesitaba especificar la clase TypeExtension
para que lo hiciera por usted.
La segunda versión se introdujo, si no recuerdo mal, con Silverlight y rápidamente llegó al compilador de WPF.
EDITAR
Mi suposición sobre la clase TypeConverter
era errónea; Esto es implementado por FrameworkElementFactory
:
De la documentación :
Tipo de propiedades que admiten Typename-as-String
WPF admite técnicas que permiten especificar el valor de algunas propiedades de tipo Type sin requerir un uso de extensión de marcado x: Type. En su lugar, puede especificar el valor como una cadena que da nombre al tipo. Ejemplos de esto son ControlTemplate.TargetType y Style.TargetType. El soporte para este comportamiento no se proporciona a través de convertidores de tipo o extensiones de marcado. En su lugar, este es un comportamiento de aplazamiento implementado a través de FrameworkElementFactory.
Silverlight apoya una convención similar. De hecho, Silverlight actualmente no admite {x: Type} en su compatibilidad con el lenguaje XAML, y no acepta los usos de {x: Type} fuera de algunas circunstancias que están diseñadas para admitir la migración XAML de WPF-Silverlight. Por lo tanto, el comportamiento typename-as-string está integrado en toda la evaluación de propiedad nativa de Silverlight donde un Tipo es el valor.
Si está utilizando XAML 2009, x: Key se puede especificar como un elemento, para admitir explícitamente diccionarios codificados por tipos de objeto distintos de cadenas sin requerir una extensión de marcado intermedia. Consulte la sección "XAML 2009" en este tema. El resto de la sección de Comentarios se aplica específicamente a la implementación de XAML 2006.
El valor del atributo de x: Key puede ser cualquier cadena definida en la gramática XamlName o puede ser un objeto evaluado a través de una extensión de marcado. Consulte "Notas de uso de WPF" para ver un ejemplo de WPF.
Los elementos secundarios de un elemento primario que es una implementación de IDictionary deben incluir típicamente un atributo x: Key que especifica un valor de clave único dentro de ese diccionario. Los marcos pueden implementar propiedades de clave con alias para sustituir a x: Clave en tipos particulares; los tipos que definen dichas propiedades deben atribuirse a DictionaryKeyPropertyAttribute.
El código equivalente a especificar x: Key es la clave que se utiliza para el IDictionary subyacente. Por ejemplo, una clave x: que se aplica en el marcado para un recurso en WPF es equivalente al valor del parámetro clave de ResourceDictionary.Add cuando agrega el recurso a un ResourceDictionary de WPF en el código. La extensión de marca x: Type tiene una función similar al operador typeof () en C # o el operador GetType en Microsoft Visual Basic.
La extensión de marca x: Type proporciona un comportamiento de conversión de cadena de caracteres para las propiedades que toman el tipo Type. La entrada es de tipo XAML. La relación entre el tipo XAML de entrada y el tipo CLR de salida es que el Tipo de salida es el Tipo subyacente del Tipo Xaml de entrada, después de buscar el Tipo Xaml basado en el contexto del esquema XAML y el servicio IXamlTypeResolver que proporciona el contexto.
En los Servicios XAML de .NET Framework, el manejo de esta extensión de marcado está definido por la clase TypeExtension.
En implementaciones de marcos específicos, algunas propiedades que toman Tipo como un 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 ejemplos, vea la sección "Notas de uso de WPF" que sigue.
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 x: la cadena del identificador de tipo se asigna como el valor TypeName de la clase de extensión TypeExtension subyacente. Bajo el contexto de esquema XAML predeterminado para los Servicios XAML de .NET Framework, que se basa en los tipos CLR, el valor de este atributo es el Nombre del tipo deseado o contiene ese Nombre precedido por un prefijo para una asignación de espacio de nombres XAML no predeterminada .
La extensión de marca x: Type se puede utilizar en la sintaxis del elemento de objeto. En este caso, se requiere especificar el valor de la propiedad TypeName para inicializar correctamente la extensión.
La extensión de marca x: Type también se puede usar como un atributo detallado; Sin embargo, este uso no es típico: