Buscar..


Observaciones

Notas introductorias

En WPF, un estilo define los valores de una o más propiedades de dependencia para un elemento visual dado. Los estilos se utilizan en toda la aplicación para hacer que la interfaz de usuario sea más consistente (por ejemplo, para que todos los botones de diálogo tengan un tamaño uniforme) y para hacer que los cambios masivos sean más fáciles (por ejemplo, para cambiar el ancho de todos los botones).

Normalmente, los estilos se definen en un ResourceDictionary a un alto nivel en la aplicación (por ejemplo, en App.xaml o en un tema), por lo que está disponible para toda la aplicación, pero también pueden definirse para un solo elemento y sus elementos secundarios , por ejemplo, aplicar un Estilo a todos los elementos TextBlock dentro de un StackPanel .

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="Margin" Value="5,5,5,0"/>
            <Setter Property="Background" Value="#FFF0F0F0"/>
            <Setter Property="Padding" Value="5"/>
        </Style>
    </StackPanel.Resources>
        
    <TextBlock Text="First Child"/>
    <TextBlock Text="Second Child"/>
    <TextBlock Text="Third Child"/>      
</StackPanel>

Notas importantes

  • La ubicación donde se define el estilo afecta a donde está disponible.
  • Las referencias StaticResource no pueden ser resueltas por StaticResource . En otras palabras, si está definiendo un estilo que depende de otro estilo o recurso en un diccionario de recursos, debe definirse después / debajo del recurso del cual depende.
  • StaticResource es la forma recomendada de hacer referencia a estilos y otros recursos (por razones de rendimiento y comportamiento) a menos que requiera específicamente el uso de DynamicResource , por ejemplo, para temas que se pueden cambiar en tiempo de ejecución.

Recursos

MSDN tiene artículos completos sobre estilos y recursos que tienen más profundidad de la que se puede proporcionar aquí.

Definiendo un estilo nombrado

Un estilo con nombre requiere que se establezca la propiedad x:Key y se aplica solo a los elementos que hacen referencia explícita por nombre:

<StackPanel>
    <StackPanel.Resources>
        <Style x:Key="MyTextBlockStyle" TargetType="TextBlock">
            <Setter Property="Background" Value="Yellow"/>
            <Setter Property="FontWeight" Value="Bold"/>
        </Style>
    </StackPanel.Resources>
        
    <TextBlock Text="Yellow and bold!" Style="{StaticResource MyTextBlockStyle}" />
    <TextBlock Text="Also yellow and bold!" Style="{DynamicResource MyTextBlockStyle}" />
    <TextBlock Text="Plain text." />      
</StackPanel>

Definiendo un estilo implícito.

Un estilo implícito se aplica a todos los elementos de un tipo dado dentro del alcance. Un estilo implícito puede omitir x:Key ya que es implícitamente lo mismo que la propiedad TargetType del estilo.

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="Background" Value="Yellow"/>
            <Setter Property="FontWeight" Value="Bold"/>
        </Style>
    </StackPanel.Resources>

    <TextBlock Text="Yellow and bold!"  />
    <TextBlock Text="Also yellow and bold!" />
    <TextBlock Style="{x:Null}" Text="I'm not yellow or bold; I'm the control's default style!" />
</StackPanel>

Heredando de un estilo

Es común que se necesite un estilo base que defina propiedades / valores compartidos entre varios estilos que pertenezcan al mismo control, especialmente para algo como TextBlock . Esto se logra mediante el uso de la propiedad BasedOn . Los valores se heredan y luego se pueden anular.

<Style x:Key="BaseTextBlockStyle" TargetType="TextBlock">
    <Setter Property="FontSize" Value="12"/>
    <Setter Property="Foreground" Value="#FFBBBBBB" />
    <Setter Property="FontFamily" Value="Arial" />
</Style>

<Style x:Key="WarningTextBlockStyle"
       TargetType="TextBlock"
       BasedOn="{StaticResource BaseTextBlockStyle">
    <Setter Property="Foreground" Value="Red"/>
    <Setter Property="FontWeight" Value="Bold" />
</Style>

En el ejemplo anterior, cualquier TextBlock use el estilo WarningTextBlockStyle se presentará como 12px Arial en rojo y negrita.

Debido a que los estilos implícitos tienen una x:Key implícita que coincide con su TargetType , también puede heredarlos:

<!-- Implicit -->
<Style TargetType="TextBlock">
    <Setter Property="FontSize" Value="12"/>
    <Setter Property="Foreground" Value="#FFBBBBBB" />
    <Setter Property="FontFamily" Value="Arial" />
</Style>

<Style x:Key="WarningTextBlockStyle"
       TargetType="TextBlock"
       BasedOn="{StaticResource {x:Type TextBlock}}">
    <Setter Property="Foreground" Value="Red"/>
    <Setter Property="FontWeight" Value="Bold" />
</Style>


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow