WPF 自定义控件样式触发器不起作用

问题描述 投票:0回答:1

特别感谢@BionicCode 让我开始使用我的用户控件样式: 自定义控件的样式

我创建了一个带有按钮和文本块的简单演示自定义控件。现在我正在为按钮添加样式。

首先,我在代码文件中添加了一个ComponentResourceKey:

public static ComponentResourceKey ButtonStyleKey = new ComponentResourceKey(typeof(MyCustomControl), "ButtonStyle");

接下来,我将按钮样式添加到我的 Generic.xaml 文件中

<Style x:Key="{x:Static local:MyCustomControl.ButtonStyleKey}" 
   TargetType="{x:Type Button}">

<Setter Property="Background" Value="#EEEEEEEE"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="10 5"/>
<Setter Property="FontSize" Value="14" />
<Setter Property="BorderThickness" Value="2" />

<Setter Property="Template">
    <Setter.Value>
        
        <ControlTemplate TargetType="{x:Type Button}">
            
            <Grid>

                <Border x:Name="Border"
                        Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"/>

                <ContentPresenter x:Name="content" 
                                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                  Margin="{TemplateBinding Padding}"
                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                  RecognizesAccessKey="True" />
            </Grid>
            
            <ControlTemplate.Triggers>
                <Trigger Property="IsPressed" Value="True">
                    <Setter Property="Foreground" Value="Red"/>
                    <Setter Property="Margin" Value="2 1" />
                </Trigger>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="BorderThickness" Value="0"/>
                    <Setter Property="Background" Value="Orange"/>
                    <Setter Property="Foreground" Value="Blue"/>
                </Trigger>
                <Trigger Property="IsEnabled" Value="false">
                    <Setter Property="Foreground" Value="Gray"/>
                    <Setter Property="Foreground" Value="DarkGray"/>
                </Trigger>
            </ControlTemplate.Triggers>
            
        </ControlTemplate>
        
    </Setter.Value>
</Setter>

这是控件模板中的按钮

<Button Grid.Row="0" 
    x:Name="button"
    Height="65"
    Width="150"
    Content="A Button"
    Style="{DynamicResource {x:Static local:MyCustomControl.ButtonStyleKey}}"/>

问题出在 IsPressed 触发器上。背景颜色不会变成红色。

MouseOver 触发器工作正常,并将按钮的背景设置为橙色,IsEnabled 触发器也将颜色设置为禁用,所以我知道样式在其他情况下工作正常。

wpf custom-controls
1个回答
0
投票

我认为 IsMouseOver 将战胜 IsPressed,因为 IsMouseOver 是在 IsPressed 之后定义的

尝试切换它们

            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="BorderThickness" Value="0"/>
                <Setter Property="Background" Value="Orange"/>
                <Setter Property="Foreground" Value="Blue"/>
            </Trigger>
            <Trigger Property="IsPressed" Value="True">
                <Setter Property="Foreground" Value="Red"/>
                <Setter Property="Margin" Value="2 1" />
            </Trigger>

如果您想在 IsMouseOver 和 IsPressed 同时为 true 时有不同的行为,您应该查看 MultiTrigger

© www.soinside.com 2019 - 2024. All rights reserved.