Pergunta

Eu tenho um Button Style padrão aplicado transversalmente meu aplicativo que especifica um estilo de mouseover que muda o conteúdo do texto do branco ao preto. Para conseguir isso eu tentei modificar o modelo botão, removendo o ContentPresenter e substituí-lo com um TextBlock. No entanto, isso significa que eu não posso ter conteúdo misto, tais 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 melhorar a situação, eu em seguida, colocar a parte de trás ContentPresenter, e no meu (só texto) botões especificou um ContentTemplate assim:

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

E com um Template definido como abaixo. Este modelo só irá funcionar para Buttons com conteúdo textual, com outros modelos definidos conforme necessário para conteúdo misto.

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

Alguém sabe se existe uma maneira que eu posso melhorar isso ainda mais, mantendo o estilo mouseover desejado, sem ter que definir modelos personalizados?

Foi útil?

Solução

Assumindo que o conteúdo não definir explicitamente todas as cores em seu próprio país, você pode fazer isso assim:

<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>

Isso funciona porque TextBlock.Foreground é uma propriedade herdada. Enquanto os controles dentro conteúdo do seu botão não definir explicitamente o seu próprio plano, isso vai funcionar. Se eles definir suas próprias cores, todas as apostas estão fora.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top