1

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具有文本内容的 s,其他模板根据需要定义为混合内容。

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

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

4

1 回答 1

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 内容中的控件没有明确设置自己的前景,这将起作用。如果他们设置自己的颜色,那么所有的赌注都会被取消。

于 2009-10-28T23:24:06.193 回答