Pregunta

En HTML / CSS puede definir un estilo que se puede aplicar a muchos tipos de elementos, por ejemplo:

.highlight {
    color:red;
}

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

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

pero en XAML parece que tienes que definir el TargetType para los estilos, de lo contrario obtendrás un error:

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

¿hay una manera de permitir que un estilo XAML se aplique a múltiples elementos o incluso dejarlo abierto como en CSS?

¿Fue útil?

Solución

Los configuradores en los estilos WPF se verifican 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 configuradores para las propiedades de dependencia de ese tipo.

Puede establecer el tipo de destino en clases base que contienen las propiedades que desea y luego aplicar ese estilo a las clases derivadas. Por ejemplo, podría crear un estilo para los objetos de Control y luego aplicarlo a varios 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"/>

Otros consejos

<!-- 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 ambos métodos para declarar un estilo pueden responder a tu pregunta. En el primero, no se ha especificado ningún TargetType, pero los nombres de las propiedades tienen el prefijo 'Etiqueta'. En la segunda, 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>

Quería aplicar un estilo a un Textblock y un TextBox, pero la respuesta seleccionada no me funcionó porque Textblock no hereda de Control, en mi caso, quería afectar la propiedad de Visibilidad, así que usé 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 Visibilidad porque ambos elementos heredan de Frameworkelement y la propiedad está definida allí. Por supuesto, esto no funcionará para las propiedades definidas solo en Control, puede buscar en el árbol de jerarquía e intentar 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 está un poco incompleta.

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

<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 intentara establecer, por ejemplo, ItemsSource, fallaría porque no hay una fuente de control.ItemsSource

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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top