2017-06-01 41 views
0

WPF的新手,来自Web背景。MouseOver风格的触发器不会更改背景

我的风格触发器不会更改按钮背景。风格XAML:

<Window.Resources> 
    <Style TargetType="Button"> 
     <Setter Property="Background" Value="GhostWhite" /> 
     <Style.Triggers> 
      <Trigger Property="IsMouseOver" Value="True"> 
       <Setter Property="Background" Value="#F48230"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 

按钮XAML(没有相关的窗口或表格属性):

<Window...> 
    <Grid...> 
     <StackPanel Orientation="Horizontal" Grid.Row="7" Grid.Column="0" Grid.ColumnSpan="2" VerticalAlignment="Center" HorizontalAlignment="Center"> 
      <Button Name="btnEdit" Cursor="Hand" Content="Edit Settings..." HorizontalAlignment="Left" VerticalAlignment="Top" Width="100" Margin="0,0,5,0" Click="btnEdit_Click"/> 
      <Button Name="btnExit" Cursor="Hand" Content="Exit" HorizontalAlignment="Left" VerticalAlignment="Top" Width="100" Margin="5,0,0,0" Click="btnExit_Click" /> 
     </StackPanel> 
    </Grid> 
</Window> 

的按钮就拿起资源部分的背景风格,但不触发 - 鼠标悬停结果默认行为。

补充问题:有没有办法可以调试呢?我查看了Live Visual Tree,但无法弄清楚如何获取我需要的信息。

+0

我猜可视状态中按钮样式优先于触发器。你可能需要重新调整它。 – sondergard

回答

0

WPF控件有一个模板控件模板的属性。该属性告诉WPF如何在屏幕上绘制控件。 WPF Button在其ControlTemplate中使用Windows Chrome,它使用用户选择的系统颜色来实现不同应用程序之间的一致性。利用WPF和XAML的魔力,您可以创建自己的ControlTemplate,让按钮看起来合适。

一键创建样式,所以你可以选择按钮使用该模板:

<Window.Resources> 
    <Style x:Key="MyButtonStyle" TargetType="{x:Type Button}"> 
     <Setter Property="Background" Value="GhostWhite" /> 
     <Setter Property="Control.Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Button}"> 
        <!-- a simple square button --> 
        <Border Name="wrapper" 
          Width="{TemplateBinding Width}" 
          Height="{TemplateBinding Height}" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}" 
          Margin="{TemplateBinding Margin}" 
          Background="#01000000"> 
         <!-- notice the wrapper has a background that is NEAR transparent. This is important. It'll ensure the button raises the click event --> 
         <Border Name=inner 
           Background="{TemplateBinding Background}"> 
          <ContentPresenter Margin="{TemplateBinding Padding}" 
               HorizontalAlignment="Center" 
               VerticalAlignment="Center" /> 
         </Border> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <Trigger Property="IsMouseOver" Value="True"> 
       <Setter Property="Background" Value="#FFF48230"/> 
      </Trigger> 
      <Trigger Property="IsPressed" Value="true"> 
       <Setter Property="Background" Value="#FF99501B"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 

然后使用该模板上的按钮:

<Window...> 
    <Grid...> 
     <StackPanel Orientation="Horizontal" Grid.Row="7" Grid.Column="0" Grid.ColumnSpan="2" VerticalAlignment="Center" HorizontalAlignment="Center"> 
      <Button Style="{StaticResource MyButtonStyle}" Name="btnEdit" Cursor="Hand" Content="Edit Settings..." HorizontalAlignment="Left" VerticalAlignment="Top" Width="100" Margin="0,0,5,0" Click="btnEdit_Click"/> 
      <Button Style="{StaticResource MyButtonStyle}" Name="btnExit" Cursor="Hand" Content="Exit" HorizontalAlignment="Left" VerticalAlignment="Top" Width="100" Margin="5,0,0,0" Click="btnExit_Click" /> 
     </StackPanel> 
    </Grid> 
</Window> 
+0

谢谢。这很有效,看起来像是一个更好的方式,所以我接受了它。不知道为什么我的工作不正常? – ChrisV

+0

由于按钮默认使用的ControlTemplate使用Windows镶边进行设计。颜色绑定到系统颜色。 –

相关问题