保留 DataGrid 在 WPF 中打开上下文菜单时处于“选择活动状态”
本文关键字:选择 活动状态 菜单 上下文 DataGrid WPF 保留 | 更新日期: 2023-09-27 18:35:31
我有一个DataGrid
,它有一个IsSelectionActive
的样式;但是,一旦ContextMenu
打开,网格就会失去IsSelectionActive
,在用户看来,好像上下文菜单以某种方式选择了它,可能会使用户感到困惑。
有没有办法在上下文菜单打开时保留IsSelectionActive
?
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<!--<Condition Property="Selector.IsFocused" Value="True" />-->
<Condition Property="IsSelected" Value="True" />
</MultiTrigger.Conditions>
<Setter Property="Background" Value="Red" />
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Selector.IsFocused" Value="False" />
<Condition Property="IsSelected" Value="False" />
</MultiTrigger.Conditions>
<Setter Property="Background" Value="Green" />
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Selector.IsFocused" Value="False" />
<Condition Property="IsSelected" Value="True" />
</MultiTrigger.Conditions>
<Setter Property="Background" Value="Blue" />
</MultiTrigger>
下面是
我在测试应用程序中用于获取所需行为的整个 XAML:
<Window x:Class="DataGridSelectionActive.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:DataGridSelectionActive"
Title="MainWindow" Height="350" Width="525">
<!-- People is just an ObservableCollection derived class. -->
<Window.DataContext>
<local:People/>
</Window.DataContext>
<Window.Resources>
<ContextMenu x:Key="dataGridContextMenu">
<MenuItem Header="Some context menu item"/>
</ContextMenu>
<Style TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
<Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
</Trigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="True"/>
<Condition Binding="{Binding IsKeyboardFocusWithin, RelativeSource={RelativeSource AncestorType=DataGrid}}" Value="False"/>
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="True"/>
<Condition Binding="{Binding ContextMenu.IsOpen, RelativeSource={RelativeSource AncestorType=DataGrid}}" Value="True"/>
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
<Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<DockPanel>
<!-- Added button for testing keyboard focus. -->
<Button DockPanel.Dock="Top" Content="Click me"/>
<DataGrid ItemsSource="{Binding}" ContextMenu="{StaticResource dataGridContextMenu}"/>
</DockPanel>
</Window>
启用此行为的关键是,如果具有冲突Setters
的多个触发器同时处于活动状态,则最后一个触发器获胜。