C# 不应用样式

C# 不应用样式,c#,wpf,C#,Wpf,我有以下自定义按钮样式的触发器: <Trigger Property="IsEnabled" Value="true"> <Setter Property="BorderBrush" Value="#FFFFFFFF" /> <Setter Property="Foreground" Value="#FFFFFFFF" /> </Trigger> <Trigger Property="IsEnabled" Value="fal

我有以下自定义按钮样式的触发器:

<Trigger Property="IsEnabled" Value="true">
    <Setter Property="BorderBrush" Value="#FFFFFFFF" />
    <Setter Property="Foreground" Value="#FFFFFFFF" />
</Trigger>
<Trigger Property="IsEnabled" Value="false">
    <Setter Property="BorderBrush" Value="#FFFF9800" />
    <Setter Property="Foreground" Value="#FFFF9800" />
</Trigger>

但它们根本不适用于我的GUI。下面是整个风格

<Window.Resources>
    <Style x:Key="Button.Hoverless" TargetType="{x:Type ButtonBase}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ButtonBase}">
                    <Border Name="border"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        Padding="{TemplateBinding Padding}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        Background="{TemplateBinding Background}">
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                    </Border>
                    <ControlTemplate.Triggers>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsMouseOver" Value="True" />
                                <Condition Property="Selector.IsSelected" Value="False" />
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" Value="#FFFF9800" />
                            <Setter Property="Opacity" Value="0.50" />
                        </MultiTrigger>

                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsMouseOver" Value="True" />
                                <Condition Property="Selector.IsSelected" Value="True" />
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" Value="#FFFFB850" />
                        </MultiTrigger>

                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsMouseOver" Value="False" />
                                <Condition Property="Selector.IsSelected" Value="True" />
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" Value="#FFFF9800" />
                        </MultiTrigger>

                        <Trigger Property="IsEnabled" Value="true">
                            <Setter Property="BorderBrush" Value="#FFFFFFFF" />
                            <Setter Property="Foreground" Value="#FFFFFFFF" />
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="BorderBrush" Value="#FFFF9800" />
                            <Setter Property="Foreground" Value="#FFFF9800" />
                        </Trigger>

                        <Trigger Property="IsPressed" Value="True">
                            <Setter TargetName="border" Property="Opacity" Value="0.95" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

我是WPF造型的新手,因此我不确定我在这方面哪里出了问题。还包括按钮代码:

<Button x:Name="btnScanFP1" Content="Scan Fingerprint" Grid.Column="1" 
        HorizontalAlignment="Left" Margin="10,10,0,0" Grid.Row="4" VerticalAlignment="Top"
        Width="227" Height="21" Grid.ColumnSpan="2" FontSize="11" Click="btnScanFP1_Click"
        Background="{x:Null}" BorderBrush="#FFFF9800" Foreground="#FFFF9800"
        Style="{StaticResource Button.Hoverless}"/>

根据,显式设置属性的优先级高于样式触发器(样式触发器本身的优先级高于样式设置器)

从按钮中删除
BorderBrush=“#FFFF9800”
将允许样式触发器按预期更改边框笔刷。
前台
属性也是如此

但也许更好的解决方案是按名称引用控件模板中的边框:

<Trigger Property="IsEnabled" Value="True">
    <Setter TargetName="border" Property="BorderBrush" Value="#FFFFFFFF" />
</Trigger>

这会覆盖边框的
BorderBrush
属性上的模板绑定,因此即使在按钮上显式设置
BorderBrush
属性,它也会应用。

根据,显式设置属性的优先级高于样式触发器(样式触发器本身的优先级高于样式设置器)

从按钮中删除
BorderBrush=“#FFFF9800”
将允许样式触发器按预期更改边框笔刷。
前台
属性也是如此

但也许更好的解决方案是按名称引用控件模板中的边框:

<Trigger Property="IsEnabled" Value="True">
    <Setter TargetName="border" Property="BorderBrush" Value="#FFFFFFFF" />
</Trigger>


这将覆盖边框的
BorderBrush
属性上的模板绑定,因此即使您在按钮上显式设置了
BorderBrush
属性,它也将应用。

您已将键定义为
button.Hoverless
类型的DottedXamlName。此类规范用于属性和事件限定引用,也用于附着的成员。因此,请删除该选项。此外,在windows.Resources中创建的资源是已设置密钥的资源,因此它将自动应用。因此,无论何时需要此样式,都应将其定义为
style=“{staticResourceKeyName}”
。如果要应用于所有按钮,请删除“键”属性。您正在将按钮上的背景显式设置为
#FFFF9800
,这比样式触发器中的设置器具有更高的优先级。使用
Buttonbase
作为
TargetType
可能有点奇怪,但应该不会有问题,因为
Button
继承自
Buttonbase
@PieterWitvoet您是对的。这确实解决了问题。你愿意回答这个问题吗?我只需删除按钮本身的属性。有关其他解决方案,请参阅我的编辑。您已将键定义为
button.Hoverless
,类型为DottedXamlName。此类规范用于属性和事件限定引用,也用于附着的成员。因此,请删除该选项。此外,在windows.Resources中创建的资源是已设置密钥的资源,因此它将自动应用。因此,无论何时需要此样式,都应将其定义为
style=“{staticResourceKeyName}”
。如果要应用于所有按钮,请删除“键”属性。您正在将按钮上的背景显式设置为
#FFFF9800
,这比样式触发器中的设置器具有更高的优先级。使用
Buttonbase
作为
TargetType
可能有点奇怪,但应该不会有问题,因为
Button
继承自
Buttonbase
@PieterWitvoet您是对的。这确实解决了问题。你愿意回答这个问题吗?我只需要删除按钮本身的属性。请参阅我的编辑以获取其他解决方案。