es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Estilo WPF. El disparador no cambia el color de fondo de mi botón cuando el mouse está sobre él.

Como dice el título, simplemente no puedo hacer que el desencadenante para cambiar el fondo funcione dentro de la plantilla. Estoy atascado ahora durante un par de días…

Mi plantilla:

<resourcedictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <style targettype="{x:Type Button}" x:key="TitleBarButtonTheme">
        <Style.Setters>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Grid VerticalAlignment="Stretch" 
                              HorizontalAlignment="Stretch">
                            <TextBlock Text="{TemplateBinding Property=Content}"
                                       VerticalAlignment="Center"
                                       HorizontalAlignment="Center"
                                       Foreground="#adadad"
                                       Width="{TemplateBinding Property=Width}"
                                       Height="{TemplateBinding Property=Height}"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style.Setters>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="Red"/>
            </Trigger>
        </Style.Triggers>
    </style>
</resourcedictionary>

La vista:

<button width="21" height="16" content="_" style="{StaticResource TitleBarButtonTheme}"></button>
Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el disparador definido en el estilo no está funcionando correctamente dentro de la plantilla. Una posible solución es mover el disparador fuera de la plantilla y usar TemplateBinding para vincular la propiedad de fondo al valor del disparador.

    Aquí hay una versión actualizada de la plantilla:

    <resourcedictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <style targettype="{x:Type Button}" x:key="TitleBarButtonTheme">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Grid VerticalAlignment="Stretch"
                              HorizontalAlignment="Stretch">
                            <TextBlock Text="{TemplateBinding Property=Content}"
                                       VerticalAlignment="Center"
                                       HorizontalAlignment="Center"
                                       Foreground="#adadad"
                                       Width="{TemplateBinding Property=Width}"
                                       Height="{TemplateBinding Property=Height}"/>
                            <Rectangle Fill="{TemplateBinding Property=Background}"
                                       Opacity="0"
                                       x:Name="PART_Highlight"
                                       RadiusX="2"
                                       RadiusY="2"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="PART_Highlight" Property="Opacity" Value="0.6"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </style>
    </resourcedictionary>
    

    El cambio principal es la adición de un elemento Rectangle llamado “PART_Highlight” dentro de la plantilla, que se utilizará para resaltar el botón cuando el mouse se encuentre sobre él. La propiedad Fill del Rectangle está vinculada a la propiedad Background del botón utilizando TemplateBinding.

    El disparador que cambia la opacidad del Rectangle se define fuera de la plantilla, en la sección ControlTemplate.Triggers. De esta manera, podemos manipular las propiedades del Rectangle directamente sin necesidad de un Setter.

    En su vista, puede usar la plantilla actualizada de la siguiente manera:

    <button width="21" height="16" content="_" style="{StaticResource TitleBarButtonTheme}" background="White"></button>
    

    Note que agregué una propiedad Background al botón para que el rectangle tenga algo que rellenar inicialmente.

    Con estos cambios, el botón debería tener un fondo resaltado cuando el mouse se encuentre sobre él.

Comments are closed.