背景不会改变按钮C#WPF

Har*_*n N 4 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>
Run Code Online (Sandbox Code Playgroud)

但背景是默认的.但是当我改变属性BorderThickness然后它起作用.

我究竟做错了什么?

Roh*_*ats 8

在按钮的默认模板中,ControlTemplate中有一个触发器,它将按钮的背景设置为#FFBEE6FD,因为控件模板触发器的优先级高于Style触发器,这就是你的触发器永远无法工作的原因.

为此,您必须覆盖按钮的默认模板并从中删除该触发器,以便应用样式触发器.

以下是已注释掉该特定触发器的默认模板.如果你想要覆盖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>
Run Code Online (Sandbox Code Playgroud)

如何将控件模板设置为按钮?

在父面板或UserControl的资源部分下的某处定义模板,可以通过StaticResource应用:

<Grid>
   <Grid.Resources>
      <ControlTemplate x:Key="MyTemplate"
                       TargetType="ButtonBase">
       .......
   </Grid.Resources>
   <Button Name="register" Template="{StaticResource MyTemplate}"...>
</Grid>
Run Code Online (Sandbox Code Playgroud)


Rac*_*hel 6

编辑:正如罗希特在评论中指出的那样,

这在 Windows 8 上不起作用,因为PresentationFramework 中声明了默认按钮模板的一些更改。...在 Windows 7 中,按钮的默认模板没有 ControlTemplate 触发器。这就是为什么您发布的代码在 Windows7 上运行良好,但在 Windows 8 及更高版本上不起作用。


Rohit关于 DependencyProperty Precedence 是原因的回答是正确的,但修复它的方法比覆盖按钮的模板要简单得多。

如果您查看DependencyProperty 优先级列表,您会注意到 中设置的属性<Tag>比 Triggered 属性具有更高的优先级,这就是为什么您的按钮将始终使用您在标记中定义的背景<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>
Run Code Online (Sandbox Code Playgroud)

  • @Rachel - 哦好吧。它无法在 Windows 8 上运行,因为在PresentationFramework 中声明了默认按钮模板的情况下也发生了相同的更改。我在 Windows 8.1、.Net 4.5、VS 2013 上进行了测试。在 Windows 7 中,按钮的默认模板没有 ControlTemplate 触发器。这就是为什么您发布的代码在 Windows7 上运行良好,但在 Windows 8 及更高版本上不起作用。 (2认同)
  • @RohitVats 这解释了,谢谢。我对自己进行了事后怀疑,因为我已经从您那里看到了很多很棒的 WPF 答案,而且当谈到 WPF 时,您肯定知道自己在说什么,但我已经对此进行了测试,并且效果很好。我将用该信息更新我的答案:) (2认同)