为什么同一控件上的多个 DataTriggers 不起作用?

Why do multiple DataTriggers on same control not work?

我想创建一个在 IsMouseOver 和 IsPressed 事件上具有不同突出显示效果的图像按钮。我使用的代码:

<Button Style="{StaticResource AccentedSquareButtonStyle}" x:Name="button" Background="Transparent" BorderThickness="0" Foreground="Transparent" Grid.Column="1" HorizontalAlignment="Left" Margin="142,-2,0,0" VerticalAlignment="Top" Width="75">
            <Grid Background="Transparent">
                <ContentControl>
                    <ContentControl.Style>
                        <Style TargetType="{x:Type ContentControl}">
                            <Setter Property="Content" Value="{StaticResource printIcon}"/>
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=IsPressed}" Value="True" >
                                    <Setter Property="Content" Value="{StaticResource printIconClicked}"/>
                                </DataTrigger>
                                <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=IsMouseOver}" Value="True" >
                                    <Setter Property="Content" Value="{StaticResource printIconHighlighted}"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </ContentControl.Style>
                </ContentControl>
            </Grid>
        </Button>

仅当我单独使用 DataTriggers 时代码才有效,但在这种形式中仅使用了 MouseOver 突出显示效果。我正在使用 MahApps 框架。 我做错了什么?

有关多触发器的详细说明,请参阅 Wpf 教程博客。这是 link: http://www.wpf-tutorial.com/styles/multi-triggers-multitrigger-multidatatrigger/

如果这回答了您的问题,请告诉我。

如您所知,这与定义 Triggers 的顺序有关。由于您要绑定到两个不同的路径(均与鼠标相关),因此定义它们的顺序很重要,因为它将决定首先触发哪个路径。

当您点击一个按钮时,事件的顺序是:

  1. 鼠标悬停在
  2. 按钮被按下

那么,您当前的触发器会发生什么:

<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=IsPressed}" Value="True" >
    <Setter Property="Content" Value="{StaticResource printIconClicked}"/>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=IsMouseOver}" Value="True" >
    <Setter Property="Content" Value="{StaticResource printIconHighlighted}"/>
</DataTrigger>

鼠标悬停是唯一实际进行设置的,因为您的鼠标指针在按下时 "over" 按钮。如果您按下按钮然后 "drag away" 同时仍然按住左键单击,则此实现应该可以工作。不过这并不理想。

要修复,只需在数据触发时交换顺序(因为顺序很重要)

<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=IsMouseOver}" Value="True" >
    <Setter Property="Content" Value="{StaticResource printIconHighlighted}"/>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=IsPressed}" Value="True" >
    <Setter Property="Content" Value="{StaticResource printIconClicked}"/>
</DataTrigger>