2009-10-28 59 views
1

我有一个标准的ButtonStyle应用于我的应用程序,该应用程序指定将文本内容从白色变为黑色的鼠标悬停样式。为此,我尝试修改按钮模板,删除ContentPresenter并用TextBlock替换它。然而,这意味着我不能有混合内容,如:带有混合内容的WPF按钮上的鼠标移过样式

<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

假设内容没有明确设定自己的任何颜色,你可以像这样实现:

<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内容中的控件没有明确地设置它们自己的前景,就可以工作。如果他们设置了自己的颜色,所有投注都将关闭。

+0

谢谢你的回答。我以前没有做过任何与遗传属性有关的事情。不幸的是,我的TextBlocks确实设置了自己的颜色,因为我不希望它们使用系统默认值。我可能需要在该问题上发布一个新问题..... – 2009-11-04 00:22:00

+0

不适合我。 – flq 2012-07-27 10:46:07