Pregunta

Tengo un Button estándar Style aplicado en mi aplicación que especifica un estilo de mouseover que cambia el contenido del texto de blanco a negro. Para lograr esto, he intentado modificar la plantilla del botón, eliminar el ContentPresenter y reemplazarlo con un TextBlock . Sin embargo, esto significa que no puedo tener contenido mixto como:

<Button
    <Button.Content>
        <StackPanel Orientation="Horizontal">
            <Path Margin="3" Width="12.375" Height="9.70833" Canvas.Left="0" Canvas.Top="0"
                  Stretch="Fill" Fill="#FF115485"
                  Data="F1 M 18.8333,7.08333L 16.7083,4.91667L 10.5,10.5417L 8.52083,8.6875L 6.45833,10.4792L 10.4792,14.625L 18.8333,7.08333 Z "/>
            <TextBlock Margin="3">Hello</TextBlock>
        </StackPanel>
    </Button.Content>
</Button>

Para mejorar la situación, vuelvo a colocar el ContentPresenter y en mis botones (solo texto) especifico una ContentTemplate como esta:

<Button IsDefault="True" Content="Text only Button"
        ContentTemplate="{StaticResource TextButtonTemplate}"
        Command="{Binding ...}" 
        CommandParameter="{...}" />

Y con una Template definida como a continuación. Esta plantilla solo funcionará para Button s con contenido textual, con otras plantillas definidas según sea necesario para contenido mixto.

<DataTemplate x:Key="TextButtonTemplate">
    <TextBlock Text="{TemplateBinding Content}"
               Foreground="{Binding Path=Foreground,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Button}}" />
</DataTemplate>

¿Alguien sabe si hay una manera de mejorar esto aún más manteniendo el estilo de mouseover deseado, sin tener que definir plantillas personalizadas?

¿Fue útil?

Solución

Suponiendo que el contenido no establece explícitamente ningún color por sí solo, puede lograr esto de la siguiente manera:

<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}">
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="TextBlock.Foreground" Value="Red" />
        </Trigger>
    </Style.Triggers>
</Style>

Esto funciona porque TextBlock.Foreground es una propiedad heredada. Mientras los controles dentro del contenido de su Botón no establezcan explícitamente su propio primer plano, esto funcionará. Si establecen sus propios colores, todas las apuestas están apagadas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top