2013-09-27 76 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>