Wpf 为什么此自定义控件中的这些触发器/事件从控件继承而不是从按钮继承时起作用?

Wpf 为什么此自定义控件中的这些触发器/事件从控件继承而不是从按钮继承时起作用?,wpf,xaml,events,triggers,Wpf,Xaml,Events,Triggers,当此自定义控件从控件继承时,这些触发器会像预期的那样工作,但当它从按钮继承时,这些触发器不会像预期的那样工作。当它从按钮继承时,第二个触发器永远不会被触发。此外,从按钮继承时,如果鼠标按钮保持按下状态,即使光标移出控件,控件仍将保持悬停状态(即满足第一个触发器) Generic.xaml中的代码段: <Style TargetType="{x:Type ui:SquareButton}"> <Setter Property="Background" Value="{St

当此自定义控件从控件继承时,这些触发器会像预期的那样工作,但当它从按钮继承时,这些触发器不会像预期的那样工作。当它从按钮继承时,第二个触发器永远不会被触发。此外,从按钮继承时,如果鼠标按钮保持按下状态,即使光标移出控件,控件仍将保持悬停状态(即满足第一个触发器)

Generic.xaml中的代码段:

<Style TargetType="{x:Type ui:SquareButton}">
    <Setter Property="Background" Value="{StaticResource BackgroundColorBrush}" />
    <Setter Property="BorderBrush" Value="{StaticResource MainColorBrush}" />
    <Setter Property="BorderThickness" Value="1" />
    <Setter Property="CornerRadius" Value="0,2,2,0" />
    <Setter Property="Padding" Value="2" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ui:SquareButton}">
                <Border x:Name="PART_Border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" HorizontalAlignment="Center" CornerRadius="{TemplateBinding CornerRadius}">
                    <Grid Height="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=AHeight}" Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Height}">
                        <ui:ColorableImage x:Name="PART_Image" Source="calendar-black.png" Color="Black" Stretch="None"/>
                    </Grid>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" Value="{StaticResource SecondaryColorBrush}" />
                    </Trigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsMouseOver" Value="True" />
                            <Condition Property="IsMouseLeftButtonDown" Value="True" />
                        </MultiTrigger.Conditions>
                        <Setter Property="Background" Value="{StaticResource MainColorBrush}" />
                        <Setter TargetName="PART_Image" Property="Color" Value="{StaticResource BackgroundColor}" />
                    </MultiTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

您可以在iPressed属性上使用触发器,而不是使用multitrigger:

<Trigger Property="IsPressed" Value="True">
    <Setter Property="Background" Value="{StaticResource MainColorBrush}" />
    <Setter TargetName="PART_Image" Property="Color" Value="{StaticResource BackgroundColor}" />
</Trigger>


您是否尝试在iPressed属性上使用触发器而不是multitrigger?看起来很有效。不幸的是,我的按钮跨越了容器的整个宽度。。。但这是另一个问题。把它贴出来作为答案,我会接受的是的,一个按钮总是占据所有可用的空间。您必须更改垂直对齐和水平对齐属性才能更改。是的,我刚刚计算出来。我也用一个普通的按钮测试了它,看它的行为是否与我的控件一致,确实如此,所以它只是一个WPF的东西。谢谢
<Trigger Property="IsPressed" Value="True">
    <Setter Property="Background" Value="{StaticResource MainColorBrush}" />
    <Setter TargetName="PART_Image" Property="Color" Value="{StaticResource BackgroundColor}" />
</Trigger>