为什么同一控件上的多个 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
的顺序有关。由于您要绑定到两个不同的路径(均与鼠标相关),因此定义它们的顺序很重要,因为它将决定首先触发哪个路径。
当您点击一个按钮时,事件的顺序是:
- 鼠标悬停在
- 按钮被按下
那么,您当前的触发器会发生什么:
<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>
我想创建一个在 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
的顺序有关。由于您要绑定到两个不同的路径(均与鼠标相关),因此定义它们的顺序很重要,因为它将决定首先触发哪个路径。
当您点击一个按钮时,事件的顺序是:
- 鼠标悬停在
- 按钮被按下
那么,您当前的触发器会发生什么:
<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>