我在我的应用程序中应用了一个标准的 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>

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

有帮助吗?

解决方案

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

<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内容中的控件没有显式设置自己的前景,这就行了。如果他们设置了自己的颜色,那么所有的赌注都会被取消。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top