2013-07-20 3 views
4

Я хочу, чтобы красная кнопка становилась черной, когда мышь нависала над ней.WPF Trigger не работает по назначению

<Button Content="Hover me" Grid.Column="3" Grid.Row="3"> 
     <Button.Style> 
      <Style TargetType="{x:Type Button}"> 
       <Setter Property="Background" Value="Red"/> 
       <Style.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter Property="Background" Value="Black"/> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </Button.Style> 
    </Button> 

Однако, моя проблема заключается в том, что когда я наведите курсор мыши на кнопку, она превращается в стиль Windows, по умолчанию с градиентом серым внешним видом.

ответ

11

Попробуйте

<Window.Resources> 
    <Style x:Key="MyButtonStyle" TargetType="{x:Type Button}"> 
     <Setter Property="Background" Value="Red"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Button}"> 
        <Border Background="{TemplateBinding Background}" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}"> 
         <ContentPresenter x:Name="PART_Content" 
              VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
              TextElement.Foreground="{TemplateBinding Foreground}"></ContentPresenter>      </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <Trigger Property="IsMouseOver" Value="True"> 
       <Setter Property="Background" Value="Black"/> 
       <Setter Property="Foreground" Value="White"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 

и применить пользовательский стиль следующим

<Button Content="Hover me" Style="{StaticResource MyButtonStyle}" Height="30" Width="100"/> 

Причина в том, по умолчанию Aero стиль кнопки панели. Он имеет хром, определенный в ControlTemplate, который имеет собственное поведение при различных событиях мыши. Итак, чтобы написать свой триггерный вызов.

Поэтому вы должны переопределить стандартный элемент управления ControlTemplate Button для достижения желаемого результата.

+2

Я искал часы, это работает спасибо! Однако должен быть лучший способ - наличие нескольких строк вместо простого триггера на гувере для цвета фона было бы неплохо. Вместо этого ужасного ControlTemplate. Слишком много кода для такого небольшого события; ( – Terning