2015-02-05 103 views
2

我想改变鼠标悬停的样式。背景不改变按钮C#WPF

我的代码是:

<Button Name="register" Content="Register" Margin="15,410,20,0" Padding="6" FontSize="18" VerticalAlignment="Top" Background="#FF0090D6" BorderBrush="#FF0090D6" Foreground="White"> 
        <Button.Style> 
         <Style TargetType="Button"> 
          <Style.Triggers> 
           <Trigger Property="IsMouseOver" Value="True"> 
            <Setter Property="Background" Value="Red"></Setter> 
           </Trigger> 
          </Style.Triggers> 
         </Style> 
        </Button.Style> 
       </Button> 

但背景是相同的默认的事情。但是,当我改变财产BorderThickness然后它的工作。

我在做什么错了?

+0

如果您为该颜色设置了RGBA值,它会工作吗? – Stilgar 2015-02-05 14:47:49

+0

@Stilgar如何设置rgba?属性窗口确实显示我输入的颜色 – 2015-02-05 14:50:47

回答

5

在按钮的默认模板,有触发在控件模板里面设置按钮的背景#FFBEE6FD,自控制模板触发有higher precedence相比风格触发,这就是为什么你的触发永远不会奏效。

为了达到这个目的,您必须重写默认的按钮模板并从中删除该触发器,以便应用您的样式触发器。

以下是将该特定触发器注释掉的默认模板。如果你想重写BorderBrush,也可以从模板中删除它。

<ControlTemplate x:Key="DefaultTemplateOfButton" TargetType="ButtonBase"> 
    <Border BorderThickness="{TemplateBinding Border.BorderThickness}" 
       BorderBrush="{TemplateBinding Border.BorderBrush}" 
       Background="{TemplateBinding Panel.Background}" 
       Name="border" 
       SnapsToDevicePixels="True"> 
     <ContentPresenter RecognizesAccessKey="True" 
           Content="{TemplateBinding ContentControl.Content}" 
           ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" 
           ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" 
           Name="contentPresenter" 
           Margin="{TemplateBinding Control.Padding}" 
           HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" 
           VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" 
           SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" 
           Focusable="False" /> 
    </Border> 
    <ControlTemplate.Triggers> 
     <Trigger Property="Button.IsDefaulted" Value="True"> 
      <Setter Property="Border.BorderBrush" TargetName="border"> 
       <Setter.Value> 
        <DynamicResource ResourceKey="{x:Static SystemColors.HighlightBrushKey}" /> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
     <Trigger Property="UIElement.IsMouseOver" Value="True"> 
      <!--<Setter Property="Panel.Background" TargetName="border"> 
       <Setter.Value> 
        <SolidColorBrush>#FFBEE6FD</SolidColorBrush> 
       </Setter.Value> 
      </Setter>--> 
      <Setter Property="Border.BorderBrush" TargetName="border"> 
       <Setter.Value> 
        <SolidColorBrush>#FF3C7FB1</SolidColorBrush> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
     <Trigger Property="ButtonBase.IsPressed" Value="True"> 
      <Setter Property="Panel.Background" TargetName="border"> 
       <Setter.Value> 
        <SolidColorBrush>#FFC4E5F6</SolidColorBrush> 
       </Setter.Value> 
      </Setter> 
      <Setter Property="Border.BorderBrush" TargetName="border"> 
       <Setter.Value> 
        <SolidColorBrush>#FF2C628B</SolidColorBrush> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
     <Trigger Property="ToggleButton.IsChecked" Value="True"> 
      <Setter Property="Panel.Background" TargetName="border"> 
       <Setter.Value> 
        <SolidColorBrush>#FFBCDDEE</SolidColorBrush> 
       </Setter.Value> 
      </Setter> 
      <Setter Property="Border.BorderBrush" TargetName="border"> 
       <Setter.Value> 
        <SolidColorBrush>#FF245A83</SolidColorBrush> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
     <Trigger Property="UIElement.IsEnabled" Value="False"> 
      <Setter Property="Panel.Background" TargetName="border"> 
       <Setter.Value> 
        <SolidColorBrush>#FFF4F4F4</SolidColorBrush> 
       </Setter.Value> 
      </Setter> 
      <Setter Property="Border.BorderBrush" TargetName="border"> 
       <Setter.Value> 
        <SolidColorBrush>#FFADB2B5</SolidColorBrush> 
       </Setter.Value> 
      </Setter> 
      <Setter Property="TextElement.Foreground" TargetName="contentPresenter"> 
       <Setter.Value> 
        <SolidColorBrush>#FF838383</SolidColorBrush> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

如何设置控制模板按钮?

定义模板下的父面板或用户控件,并且可以通过静态资源应用的资源部分地方:

<Grid> 
    <Grid.Resources> 
     <ControlTemplate x:Key="MyTemplate" 
         TargetType="ButtonBase"> 
     ....... 
    </Grid.Resources> 
    <Button Name="register" Template="{StaticResource MyTemplate}"...> 
</Grid> 
+0

如何将控件模板设置为按钮 – 2015-02-05 15:12:33

+0

编辑答案。有一张支票。 – 2015-02-05 15:18:22

+1

完美的工作......! – 2015-02-05 15:23:46

2

您必须重写默认模板才能实现此目的。

<Button Content="Button" HorizontalAlignment="Left" VerticalAlignment="Bottom" Width="50" Height="50" HorizontalContentAlignment="Left" BorderBrush="{x:Null}" Foreground="{x:Null}" Margin="50,0,0,0"> 
      <Button.Style> 
       <Style TargetType="{x:Type Button}"> 
        <Setter Property="Background" Value="Green"/> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="{x:Type Button}"> 
           <Border Background="{TemplateBinding Background}"> 
            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> 
           </Border> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
        <Style.Triggers> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <Setter Property="Background" Value="DarkGoldenrod"/> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 
      </Button.Style> 
     </Button> 

希望这会有所帮助。

+0

不透明度与我给出的代码一起工作,它不会更改背景,边界刷等。 – 2015-02-05 15:00:57

+0

我刚刚更新了我的答案,请参阅。 – 2015-02-05 15:05:46

4

编辑:作为罗希特指出in the comments

这亿韩元在Windows 8上工作,因为在PresentationFramework中声明了默认的按钮模板的一些变化。 ...在Windows 7中默认的按钮模板没有该ControlTemplate触发器。这就是为什么你发布的代码在Windows7上工作正常,但它不能在Windows 8和更高版本上工作。


Rohit's answer有关的DependencyProperty优先级分别为起因是正确的,但有固定它不是覆盖Button的模板的一个更简单的方法。

如果您查看DependencyProperty Precedence List,你会发现,在<Tag>设置属性具有优先级高于触发特性,这就是为什么你的按钮会一直使用您已在<Button>标签定义的背景。

如果您将Background属性移至<Style>本身,触发属性将起作用,因为触发属性优先于样式中定义的属性。

<Button Name="register" Content="Register" ...> 
    <Button.Style> 
     <Style TargetType="Button"> 
      <Setter Property="Background" Value="#FF0090D6" /> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="Background" Value="Red" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 
+0

你有试过吗?这不起作用,因为Style设置器与模板触发器相比具有较低的优先级。 (我只是做了一个交叉检查,它不起作用)。 – 2015-02-05 15:51:25

+0

是的,我发布这个答案之前,我测试了它,它工作正常。我使用的是VS2010,Windows 7和.Net 4.0。您是否在使用Button的任何自定义模板?默认优先顺序为''>'TemplatedParent'模板属性>隐式样式>样式触发器>模板触发器>样式设置器>默认值。如果你有一个自定义的模板,那么你可能需要改变整个Button.Template,否则我不这么认为。 – Rachel 2015-02-05 15:55:58

+0

@Rachel在我的情况下不起作用。我正在使用VS 2012旗舰版,Windows 8,.NET 4.5 – 2015-02-05 15:59:01