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命名空间的一部分。 你可以检查它,并无耻地覆盖任何你不喜欢的颜色!