2011-02-01 19 views
13

todo está en el título:¿Qué hace x: Key = "{x: Type TextBox}" do?

He leído más de una vez que la creación de un estilo como este:

<Style TargetType="TextBox">...</Style> 

era más o menos equivalente a:

<Style x:Key="{x:Type TextBox}" TargetType="TextBox">...</Style> 

(última vez in a comment on another question)

ambos deben aplicar el estilo a todos los cuadros de texto en la aplicación (si se ponen en los recursos de la aplicación, por supuesto)

pero probé ambas en mis aplicaciones, y solo la segunda con la x: clave definida funciona.

es bastante lógico para mí, ya que el primero no sabe dónde aplicar sin ninguna x: propiedad clave establecida, pero ¿cuál es el punto de la primera sintaxis?

Editar: ejemplo de código en mi aplicación que funciona bien:

<Style x:Key="{x:Type ComboBoxItem}" TargetType="{x:Type ComboBoxItem}"> 
    <Setter Property="HorizontalContentAlignment" Value="Left"/> 
    <Setter Property="VerticalContentAlignment" Value="Center"/> 
</Style> 

y código que no es así:

<Style TargetType="{x:Type ComboBoxItem}"> 
    <Setter Property="HorizontalContentAlignment" Value="Left"/> 
    <Setter Property="VerticalContentAlignment" Value="Center"/> 
</Style> 

de escribir este para deshacerse de los temas relacionados con combinaciones que obtener con comboBoxItems cuando manipula un elemento de ComboBox existente. Y el primer código funciona bien, pero el segundo no.

se puede ver esto fácilmente estableciendo el derecho a HorizontalContentAlignment

Edición 2: Este código es simplemente poner en un diccionario de recursos en mi App.xaml. Y la sustitución de TargetType = "{x: Tipo ComboBoxItem}" con TargetType = "ComboBoxItem" no hace ninguna diferencia en absoluto

Datos 3: Me di cuenta de que podría haber olvidado que precisa algo importante (lo siento por eso): aunque el los estilos se definen en xaml, en realidad agrego los controles al diseño en mi código, ya que se agregan dinámicamente. Puede ser donde reside el problema ...

Respuesta

9

Como se muestra en el primer ejemplo anterior, establecer la propiedad TargetType a TextBlock sin asignar el estilo con una x: Key permite su estilo sea aplica a todos los elementos TextBlock. Lo que sucede realmente es que al hacerlo, establece implícitamente la clave x: a {x: tipo TextBlock}.Esto también significa que si le da al Estilo un x: Valor clave de cualquier cosa que no sea {x: Tipo TextBlock}, el Estilo no sería aplicado a todos los elementos de TextBlock automáticamente. En su lugar, necesita aplicar el estilo a los elementos de TextBlock explícitamente.

Teniendo en cuenta que esto es from the official documentation, su problema tiene que ser una anomalía. He visto algunas de esas rarezas y no son tan inesperadas ya que la codificación detrás de WPF es imperfecta.

(¿Hay alguna diferencia en los resultados entre TargetType="ComboBoxItem" y TargetType="{x:Type ComboBoxItem}" si se omite la tecla?)

+0

¿Puede explicar a qué se refiere aquí: * desde la codificación ser hind WPF está destinado a ser imperfecto. * ¿Crees que este caso es un error en WPF? Creo que necesitamos ver mucho más código antes de llegar a esa conclusión. –

+0

"¿Crees que este caso es un error en WPF?" Sí, eso es exactamente lo que quiero decir. No creo que necesites más código para llegar a esa conclusión porque tenemos una descripción de lo que * debe * suceder y un informe que de hecho no siempre es el caso. El código proporcionado parece bastante simple y si todo lo demás se deja completamente igual, puede concluir que la falla tiene que ser con un código WPF central. –

+0

Entonces, lo que está diciendo es que podría combinar la propiedad TargetType con una propiedad x: Type. Entonces su estilo de ComboBoxItem solo se aplicará cuando se asiente explícitamente en el XAML. –

2

Cada recurso necesita una clave, pero si se omite Key para un estilo, debe ser el tipo de TargetType. Por lo tanto, los dos fragmentos anteriores deberían ser equivalentes.

¿Se puede publicar el código completo donde no funciona sin la definición explícita Key?

+0

He editado mi pregunta con más ejemplos de código – David

+0

@David - ¿En qué parte de tu código está definido este estilo? –

+0

Además, en su ejemplo no funcional, intente reemplazar TargetType = "{x: Type ComboBoxItem} con TargetType =" ComboBoxItem " –

4

Ahora se puede conectar en cascada sus estilos añadiendo una:

BasedOn="{StaticResource {x:Type ComboBox}}" 

en un < Estilo/> más abajo del documento, por ejemplo:

<Window.Resources> 
    <Style x:Key="{x:Type TextBox}" TargetType="{x:Type TextBox}"> 
      <Setter Property="HorizontalContentAlignment" Value="Left"/> 
      <Setter Property="VerticalContentAlignment" Value="Center"/> 
     </Style> 
</Window.Resources> 
<StackPanel> 
    <TextBox>I'm Left-Center</TextBox> 
    <Grid> 
     <Grid.Resources> 
      <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}"> 
       <Setter Property="HorizontalContentAlignment" Value="Right"/> 
      </Style> 
     <Grid.Resources> 
     <TextBox>I'm Right-Center</TextBox> 
    </Grid> 
</StackPanel> 
+0

no sabía esta sintaxis, ¡interesante! realmente no dice lo que hace la x: key = "{x: type xxx}", sin embargo. – David

+0

Su ejemplo funciona sin la clave x: entonces no es realmente relevante aquí – Nicolas