在具有混合内容的WPF按钮上使用鼠标悬停样式

时间:2009-10-28 23:14:01

标签: wpf xaml button styles mouseevent

我在我的应用程序中应用了一个标准Button Style,它指定了一种鼠标悬停样式,可将文本内容从白色更改为黑色。为实现此目的,我尝试修改按钮模板,移除ContentPresenter并将其替换为TextBlock。但是,这意味着我不能拥有混合内容,例如:

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

为了改善这种情况,我将ContentPresenter重新放入,并在我的(仅限文本)按钮上指定ContentTemplate,如下所示:

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

并且Template定义如下。此模板仅适用于包含文字内容的Button,其他模板根据混合内容的需要进行定义。

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

有没有人知道我是否可以通过保持所需的鼠标悬停样式来进一步改进这一点,而无需定义自定义模板?

1 个答案:

答案 0 :(得分:1)

假设内容没有明确地设置任何颜色,您可以这样做:

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

这是有效的,因为TextBlock.Foreground是一个继承的属性。只要Button内容中的控件没有显式设置自己的前景,这就行了。如果他们设置了自己的颜色,那么所有的赌注都会被取消。