2013-09-27 101 views
1

从以下触发器只有Foreground Setter正在工作。我不懂为什么。ResourceDictionary样式触发器不起作用

<Style TargetType="{x:Type Button}"> 
<Style.Triggers> 
    <Trigger Property="IsMouseOver" Value="True"> 
    <Setter Property="Background" Value="Red"/> 
    <Setter Property="BorderBrush" Value="Red"/> 
    <Setter Property="Foreground" Value="Red"/> 
    </Trigger> 

感谢您的帮助。

+1

您将此触发器设置为何种控制?请提供更完整的示例... – MoonKnight

+0

按钮Sry没有提到它 – Florian

回答

2

这不工作的原因是因为默认的按钮模板使用ButtonChrome绘制边框和背景,并处理国家如鼠标悬停和残疾人取决于Windows主题(如Windows XP样式,Windows 7的风格)。

为了允许应用触发器,您需要定义一个自定义Button模板,该模板使用标准的可调整WPF元素(如Border)代替ButtonChrome。这是一个简单的工作示例:

<Button Content="button"> 
    <Button.Style> 
     <Style TargetType="Button"> 
      <Setter Property="BorderThickness" Value="3" /> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="Button"> 
         <Border Background="{TemplateBinding Property=Background}" 
           BorderBrush="{TemplateBinding Property=BorderBrush}" 
           BorderThickness="{TemplateBinding Property=BorderThickness}"> 
          <ContentPresenter /> 
         </Border> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="Background" Value="Red" /> 
        <Setter Property="BorderBrush" Value="Green" /> 
        <Setter Property="Foreground" Value="Blue" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 
+0

原来我有两种不同的按钮样式。其中之一有一个用于换行的文本块。我如何考虑这种风格(我想改变前景)? – Florian

+0

@ Anubis1233该按钮的前景应自动传递到TextBlock,除非您在某处设置了另一个Foreground。 – nmclean

+0

代码是(简化的按钮代码),但不会传递 – Florian

2

WPF中的按钮有一个默认控制模板。重写Button的默认行为的正确方法是覆盖默认控件模板。这可以用类似的东西来完成以下:

<Button Width="100" Height="50" Content="Click Me!"> 
    <Button.Template> 
     <ControlTemplate TargetType="{x:Type Button}"> 
      <Border x:Name="bdr_main" CornerRadius="20" Margin="4" BorderThickness="1" BorderBrush="Black" Background="LightGray"> 
       <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center" Margin="8,6,8,6" ContentSource="Content" /> 
      </Border> 
      <ControlTemplate.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter TargetName="bdr_main" Property="Background" Value="LightGreen"/> 
       </Trigger> 
       <Trigger Property="IsPressed" Value="True"> 
        <Setter TargetName="bdr_main" Property="Background" Value="Red"/> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
</Button.Template> 

找到@http://harishasanblog.blogspot.com/2011/02/ismouseover-trigger-not-working-in-wpf.html

希望它能帮助!

2

尝试在控制模板上使用触发器。

<ResourceDictionary> 
     <Style x:Key="TestButton" TargetType="Button"> 
      <Setter Property="Height" Value="30" /> 
      <Setter Property="Width" Value="30" /> 
      <Setter Property="Background" Value="Transparent" /> 
      <Setter Property="Foreground" Value="Green" /> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="Button"> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsMouseOver" Value="True"> 
           <Setter Property="Foreground" Value="Purple" /> 
          </Trigger> 
         </ControlTemplate.Triggers> 
         <Grid> 
          <Rectangle Fill="{TemplateBinding Foreground}" /> 
         </Grid> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </ResourceDictionary>