2012-02-10 7 views
26

Como se titula, y me refiero a algo como a continuación:¿Puedo tener un Estilo con múltiples TargetType en WPF?

<Style TargetType="{x:Type TextBlock}" 
     TargetType="{x:Type Label}" 
     TargetType="{x:Type Button}" > 

Esto es en realidad por el bien de la utilización de un control de 3 ª parte, he heredado su clase. Pero la plantilla no se aplica a la Subclase porque el TargetType está en la clase base. Así que me gustaría establecer múltiples TargetType s para que pueda aplicar para ambos.

Respuesta

45

No, no puede, sin embargo, a menudo crear un estilo para una clase base común como FrameworkElement, y luego crear mis estilos de control individuales que son BasedOn el estilo de base

<Style TargetType="{x:Type FrameworkElement}"> 
    <!-- Shared Setters --> 
</Style> 

<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource {x:Type FrameworkElement}}" /> 
<Style TargetType="{x:Type Label}" BasedOn="{StaticResource {x:Type FrameworkElement}}" /> 
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type FrameworkElement}}" /> 
+1

Por desgracia, hay muchas propiedades que 'FrameworkElement' no incluye (como las relacionadas con las fuentes), por lo que no se pueden incluir en los generadores de estilo. En su lugar, podría elegir 'ContentControl', pero eso no funcionaría con este ejemplo en particular, porque' TextBlock' no hereda de 'ContentControl'. – kmote

2

La respuesta es no.

TargetType es una propiedad de Style y solo se puede establecer una vez. Para asegurar el tipo de seguridad, el estilo debe apuntar a un tipo específico para saber qué propiedades establecer.

Sin embargo, hay un trabajo alrededor. Puede tomar las propiedades comunes de todos los tipos que tiene y definirlos en un estilo. Luego, cree estilos específicos para cada uno de los controles específicos y use la propiedad BasedOn para heredar del estilo básico.

0

En realidad descubrí que en una cuadrícula, solo puede establecer el estilo de un elemento. Sin embargo, en un panel de distribución puede establecer el estilo de varios elementos.

ver este código:

<Grid>   
    <StackPanel> 
     <StackPanel.Resources> 
      <Style TargetType="TextBlock"> 
       <Setter Property="FontSize" Value="12"></Setter> 
       <Setter Property="VerticalAlignment" Value="Center"></Setter> 
       <Setter Property="HorizontalAlignment" Value="Center"></Setter> 
       <Setter Property="Margin" Value="5"></Setter> 
      </Style> 
      <Style TargetType="TextBox"> 
       <Setter Property="Width" Value="100"></Setter> 
       <Setter Property="Height" Value="25"></Setter> 
       <Setter Property="Margin" Value="5"></Setter> 
      </Style> 
      <Style TargetType="Button"> 
       <Setter Property="Margin" Value="5"></Setter> 
       <Setter Property="Height" Value="30"></Setter> 
       <Setter Property="Width" Value="100"></Setter> 
      </Style> 
     </StackPanel.Resources> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock>Kanban ID</TextBlock> 
      <TextBox></TextBox> 
     </StackPanel> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock>Customer Name</TextBlock> 
      <TextBox></TextBox> 
     </StackPanel>    
     <Button>Save</Button> 
    </StackPanel> 
</Grid> 

Si se va a quitar el lugar por debajo de la y cambiar a verá que los objetos no están establecidos, las propiedades sólo el último de objeto se cambia.

Espero que esto ayude.

8

Una variación más flexible de la respuesta de Rachel es usar resourceKey para BasedOn.

Así, en lugar de:

<Style TargetType="{x:Type FrameworkElement}"> 
    <!-- Shared Setters --> 
</Style> 
<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource {x:Type FrameworkElement}}" /> 


hacer algo como:

<Style x:Key="commonStyle" TargetType="{x:Type FrameworkElement}"> 
    <!-- Shared Setters --> 
</Style> 
<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource commonStyle}" /> 


Esto da más opciones, ya que algunos estilos se pueden basar en commonStyle, y algunos en, por ejemplo, commonStyle2, donde commonStyle y commonStyle2 tienen FrameworkElement como tipo de destino.

1

Sobre la base de la respuesta de Rachel, para un código más limpio, puede quitar el directorio x: Tipo dentro de la extensión de marcado y sólo tiene que utilizar el Tipo:

<Style TargetType="Label"> 
    <!-- Shared Setters --> 
</Style> 

es lo mismo que:

<Style TargetType="{x:Type Label}"> 
    <!-- Shared Setters --> 
</Style> 
Cuestiones relacionadas