wpf:DataGrid禁用选定的行样式 – 或行select

我看到了很多关于如何在DataGrid中选定行的样例,例如:

如何设置DataGrid中选定行的颜色

我可以只禁用选定的行样式吗? 我不想重写select行更改的每一件事情。 只是不想要任何可见的变化。 比创build模板更容易

要么..

禁用select行,如果这更容易..但从浏览这个论坛,似乎hacky以及

禁用在WPF DataGrid中select

想出了XAML摆脱select风格..不理想,但足够接近..

<Style x:Key="CellStyle" TargetType="{x:Type DataGridCell}"> <Setter Property="Foreground" Value="Black" /> <Style.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter Property="Background" Value="{x:Null}" /> <Setter Property="BorderBrush" Value="{x:Null}" /> </Trigger> </Style.Triggers> </Style> 

我发现了另一种适合我的情况。 我为所有单元格设置了这种样式,因为我不希望用户select任何单元格。

 <Style TargetType="{x:Type DataGridCell}"> <Setter Property="IsHitTestVisible" Value="False"/> </Style> 

以下是对我有用的东西:

 <DataGrid> <DataGrid.CellStyle> <Style TargetType="{x:Type DataGridCell}"> <Style.Triggers> <Trigger Property="DataGridCell.IsSelected" Value="True"> <Setter Property="BorderBrush"> <Setter.Value> <SolidColorBrush Color="Transparent"/> </Setter.Value> </Setter> <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> <Setter Property="Background"> <Setter.Value> <SolidColorBrush Color="Transparent"/> </Setter.Value> </Setter> </Trigger> </Style.Triggers> </Style> </DataGrid.CellStyle> <!-- ... --> </DataGrid> 

这相对简单:

 datagrid.SelectionChanged += (obj, e) => Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => datagrid.UnselectAll())); 

这将禁用DataGrid上的所有select。

如果你不想完全禁用select,但只是隐藏它,你需要修改模板。

我将首先回答第二个问题:要禁用行的select,可以更改DataGrid的RowStyle。

 <DataGrid> <DataGrid.RowStyle> <Style TargetType="DataGridRow"> <Setter Property="IsEnabled" Value="False"/> </Style> </DataGrid.RowStyle> <!--Other DataGrid items--> </DataGrid> 

但是,这会更改文本样式,因为行本身现在处于“禁用”状态。 这也不否定用户仍然可以右键点击该行来select它的事实。 如果你真的想禁用任何与datagrid行的交互,你可以做到以下几点:

 <DataGrid> <DataGrid.RowStyle> <Style TargetType="DataGridRow"> <Setter Property="IsHitTestVisible" Value="False"/> </Style> </DataGrid.RowStyle> <!--Other DataGrid items--> </DataGrid> 

由于行仍处于启用状态,因此文本的样式不会更改。

现在,如果你只想改变所选行的样式,但是保留单独的function,你可以做下面的事情(基本上和@Dan Stevens的答案相同)。 ControlTextBrushKey是系统用来为文本项目着色的画笔。 请查看DynamicResource和StaticResource之间的解释。

 <DataGrid> <DataGrid.CellStyle> <Style TargetType="{x:Type DataGridCell}"> <Style.Triggers> <Trigger Property="DataGridCell.IsSelected" Value="True"> <Setter Property="BorderBrush" Value="Transparent"/> <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> <Setter Property="Background" Value="Transparent"/> </Trigger> </Style.Triggers> </Style> </DataGrid.CellStyle> <!--Other DataGrid items--> </DataGrid> 

需要注意的是,当选中该行时,上述解决scheme不会更改DataGridRowHeader的样式,如下所示(第一行被选中)。

在这里输入图像说明

对于像我这样的人,他们有不同风格的单元格,不想覆盖所有风格,也不会为每种风格添加触发器,这是一个不错的select:

 <DataGrid.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#333333"/> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black"/> <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Black"/> <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" Color="Black"/> </DataGrid.Resources> 

HighlightBrushKey是具有活动select的高亮边框, HighlightTextBrushKey是具有活动select的文本颜色

在我的情况下,我想要非活动select看起来未选中:

InactiveSelectionHighlightBrushKey是select处于InactiveSelectionHighlightTextBrushKey状态时的边框, InactiveSelectionHighlightTextBrushKey是select处于非活动状态时的文本

仅供参考:SystemColors是一个静态类,是System.Windows.Media命名空间的一部分。 你可以检查它,并无耻地覆盖任何你不喜欢的颜色!