Tengo un problema con Styles en XAML y tal vez puedas ayudarme.

He creado un ResourceDictionary "controldefaultstyle":

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style TargetType="{x:Type Control}" x:Key="ControlDefaultStyle" >
    <Style.Setters>
        <Setter Property="FontFamily" Value="{Binding Path=FontFamily, Source={x:Static Application.Current}, UpdateSourceTrigger=PropertyChanged}"/>
        <Setter Property="FontSize" Value="{Binding Path=FontSize, Source={x:Static Application.Current}, UpdateSourceTrigger=PropertyChanged}"/>
        <Setter Property="Background" Value="{StaticResource SystemBackground}"/>
        <Setter Property="Foreground" Value="{StaticResource SystemForeground}"/>
    </Style.Setters>
</Style>

Que hice otros dos diccionarios de recursos, uno que se basa en el botón y el estilo predeterminado de control:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:ext="clr-namespace:StyleResourceDictionariesDemo.ResourceDictionaries.Classes">
<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="ControlDefaultStyle.xaml"/>
</ResourceDictionary.MergedDictionaries>
<Style TargetType="{x:Type Button}" x:Key="ButtonStyle" >
    <Style.BasedOn>
        <ext:MergedStyles BasedOn="{StaticResource {x:Type Button}}" MergeStyle="{StaticResource ControlDefaultStyle}"/>
    </Style.BasedOn>
    <Style.Setters>
        <Setter Property="Width" Value="100"/>
        <Setter Property="Height" Value="30"/>
        <Setter Property="HorizontalContentAlignment" Value="Center"/>
        <Setter Property="VerticalContentAlignment" Value="Top"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}" >
                    <Grid Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" ClipToBounds="True">
                        <Rectangle x:Name="buttonFrame" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
                               Stroke="{TemplateBinding Background}" RadiusX="5" RadiusY="5" StrokeThickness="1" Fill="Transparent"/>
                        <Rectangle x:Name="buttonBody" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
                               Stroke="Transparent" RadiusX="5" RadiusY="5" StrokeThickness="1" Fill="{TemplateBinding Background}"/>
                        <TextBlock x:Name="buttonText" HorizontalAlignment="Center" VerticalAlignment="Center" Text="{TemplateBinding Content}" 
                                   Foreground="{TemplateBinding Foreground}"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style.Setters>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="{StaticResource IsMouseOverBackground}"/>
            <Setter Property="Foreground" Value="{StaticResource IsMouseOverForeground}"/>
        </Trigger>
        <Trigger Property="IsPressed" Value="True">
            <Setter Property="Background" Value="{StaticResource IsPressedBackground}"/>
            <Setter Property="Foreground" Value="{StaticResource IsPressedForeground}"/>
        </Trigger>
    </Style.Triggers>
</Style>

Y otro en el que usa Textblock y ControlDefaultStyle:

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="ControlDefaultStyle.xaml"/>
</ResourceDictionary.MergedDictionaries>
<Style TargetType="{x:Type TextBlock}" x:Key="TextBlockStyle"  >
    <Style.BasedOn>
        <classes:MergedStyles BasedOn="{StaticResource {x:Type TextBlock}}" MergeStyle="{StaticResource ControlDefaultStyle}"/>
    </Style.BasedOn>

    <Style.Setters>
        <Setter Property="Width" Value="200"/>
        <Setter Property="Height" Value="150"/>
        <Setter Property="TextAlignment" Value="Center"/>
        <Setter Property="HorizontalAlignment" Value="Center"/>
        <Setter Property="VerticalAlignment" Value="Top"/>
        <!--<Setter Property="Background" Value="{StaticResource TextBlockBackground}"/>-->
        <!--<Setter Property="Foreground" Value="{StaticResource TextBlockForeground}"/>-->
    </Style.Setters>
</Style>

Cuando se usa el estilo del botón en un botón, todo funciona como se esperaba y los colores cambian como se desea, pero el bloque de texto no cambia el fondo y no entiendo por qué. El bloque de texto y el botón deben tener el mismo aspecto (para el fondo y el primer plano)

¿Alguna conclusión?

Saludos cordiales Mirko

Editar: izquierda correcta, el fondo derecho debe ser azul y no blanco.

Cambiar la familia de fuentes (cuadro combinado) y el tamaño (controlado por el control deslizante) funcionan tanto para los botones como para el bloque de texto.

enter image description here enter image description here

0
Exar666Kun 30 sep. 2019 a las 15:19

1 respuesta

La mejor respuesta

TextBlock no hereda del control.

Eche un vistazo a la cadena de herencia:

https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.textblock?view=netframework-4.8

Distribuidor de objetos Dependencia de objetos Objeto visual UIElement FrameworkElement TextBlock

Es por eso que su control de orientación de estilo base no se aplicará a un bloque de texto.

2
Andy 30 sep. 2019 a las 13:29