2009-04-29 18 views
51

En HTML/CSS puede definir un estilo que se puede aplicar a muchos tipos de elementos, por ejemplo:¿Puede definir múltiples TargetTypes para un estilo XAML?

.highlight { 
    color:red; 
} 

se puede aplicar tanto a P y DIV, por ejemplo:

<p class="highlight">this will be highlighted</p> 
<div class="highlight">this will also be highlighted</div> 

pero en XAML que parecen tener que definir la TargetType de estilos, de lo contrario se produce un error:

<Style x:Key="formRowLabel" TargetType="TextBlock"> 

hay una manera para permitir un estilo XAML para ser aplicado a múltiples elementos o correo ven para dejarlo abierto como en CSS?

Respuesta

59

Los ajustadores en estilos WPF se comprueban durante el tiempo de compilación; Los estilos CSS se aplican dinámicamente.

Debe especificar un tipo para que WPF pueda resolver las propiedades en los ajustadores a las propiedades de dependencia de ese tipo.

Puede establecer el tipo de destino en las clases base que contienen las propiedades que desea y luego aplicar ese estilo a las clases derivadas. Por ejemplo, se podría crear un estilo para objetos de control y luego aplicarlo a múltiples tipos de controles (Button, TextBox, CheckBox, etc.)

<Style x:Key="Highlight" TargetType="{x:Type Control}"> 
    <Setter Property="Foreground" Value="Red"/> 
</Style> 

...

<Button Style="{StaticResource Highlight}" Content="Test"/> 
<TextBox Style="{StaticResource Highlight}" Text="Test"/> 
<CheckBox Style="{StaticResource Highlight}" Content="Test"/> 
+0

Sí, pero ¿y si desea aplicarlo a botones y cuadros de texto pero no a casillas de verificación? –

+1

Puede aplicarlo a lo que desee. Este estilo debe aplicarse a los controles. Si solo se aplicará a TODOS los controles si elimina la 'x: Key = "Highlight"'. Si no desea que se aplique a CheckBoxes, deje la propiedad 'Estilo ='. –

+3

Aclaración: elimine 'x: Key = "Highlight"' de la definición de estilo para aplicar el estilo a TODAS las instancias de ese tipo. Con la tecla, elimine 'Style =' {StaticResource Highlight} '' del control para eliminar el estilo de ese control. –

-2

Tengo este trabajo

<Style x:Key="HeaderStyleThin" TargetType="{x:Type Border}"> 
    <Setter Property="Background" Value="Black" /> 

    <Style.Resources> 
     <Style TargetType="{x:Type TextBlock}"> 
       <Setter Property="Background=" Value="Red" /> 
     </Style> 
     </Style.Resources> 

</Style> 
3

Hay una respuesta alternativa a la pregunta. PUEDE dejar el parámetro TargetType fuera del estilo, lo que le permitirá aplicarlo a varios controles diferentes, pero solo si prefija el nombre de la propiedad con "Control".

<Style x:Key="Highlight"> 
    <Setter Property="Control.Foreground" Value="Red"/> 
</Style> 

Obviamente, esto solo funciona para las propiedades de la clase de control base. Si se trató de establecer ItemsSource decir, sería un error porque no hay Control.ItemsSource

+1

Al hacer esto, está implícitamente indicando un TargetType; y como dices solo funciona si el elemento al que se aplica es un Control. Por lo tanto, esto no ofrece nada más que dejar TargetType establecido en Control. –

29
<!-- Header text style --> 
<Style x:Key="headerTextStyle"> 
    <Setter Property="Label.VerticalAlignment" Value="Center"></Setter> 
    <Setter Property="Label.FontFamily" Value="Trebuchet MS"></Setter> 
    <Setter Property="Label.FontWeight" Value="Bold"></Setter> 
    <Setter Property="Label.FontSize" Value="18"></Setter> 
    <Setter Property="Label.Foreground" Value="#0066cc"></Setter> 
</Style> 

<!-- Label style --> 
<Style x:Key="labelStyle" TargetType="{x:Type Label}"> 
    <Setter Property="VerticalAlignment" Value="Top" /> 
    <Setter Property="HorizontalAlignment" Value="Left" /> 
    <Setter Property="FontWeight" Value="Bold" /> 
    <Setter Property="Margin" Value="0,0,0,5" /> 
</Style> 

Creo que estos dos métodos de declarar un estilo que podría responder a su pregunta. En el primero, no se especifica TargetType, pero los nombres de las propiedades llevan el prefijo 'Label'. En el segundo, el estilo se crea para los objetos Label.

Otro método para hacerlo es:

<UserControl.Resources> 
    <Style x:Key="commonStyle" TargetType="Control"> 
    <Setter Property="FontSize" Value="24"/> 
    </Style> 
    <Style BasedOn="{StaticResource commonStyle}" TargetType="ListBox"/> 
    <Style BasedOn="{StaticResource commonStyle}" TargetType="ComboBox"/> 
</UserControl.Resources> 
+0

headerTextStyle solo se puede aplicar a Label y las clases que se derivan de él, por lo tanto, no obtendrá nada si deja el TargetType. –

+0

@Steve: Creo que este podría responder a su duda. – Gaurang

+0

para el primer ejemplo, puede reemplazar 'Label' con' UIElement' para que funcione generalmente en varios tipos de controles – Julien

2

quería aplicar un estilo a un Textblock y un cuadro de texto, pero la respuesta seleccionada no funcionó para mí porque Textblock no hereda de Control, en mi caso yo quería afectar la propiedad de visibilidad, por lo que utiliza FrameworkElement

<Style x:Key="ShowIfRequiredStyle" TargetType="{x:Type FrameworkElement}"> 
     <Setter Property="Visibility" Value="Collapsed"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding ShowIfRequiredStyle, UpdateSourceTrigger=PropertyChanged}" Value="true"> 
       <Setter Property="Visibility" Value="Visible"/> 
      </DataTrigger> 
     </Style.Triggers> 
</Style> 

<TextBlock Style="{StaticResource ResourceKey=ShowIfRequiredStyle}"/> 
<TextBox Style="{StaticResource ResourceKey=ShowIfRequiredStyle}"/> 

Esto funciona para la propiedad de visibilidad debido a que ambos elementos heredan de FrameworkElement y la propiedad se define allí. Por supuesto, esto no funcionará para propiedades definidas solo en Control, puede buscar en el árbol de jerarquía y tratar de encontrar una clase base, de todos modos pensé que esto podría ayudar a alguien ya que este es un resultado de búsqueda superior y la respuesta seleccionada es un poco incompleta.

+1

yes TargetType = "{x: Type FrameworkElement}" funcionó para mí, no el 'control' –

Cuestiones relacionadas