选择后更改整个数据网格行的背景颜色
Posted
技术标签:
【中文标题】选择后更改整个数据网格行的背景颜色【英文标题】:Change Background Color of whole datagrid row upon selection 【发布时间】:2013-03-07 01:28:31 【问题描述】:我目前正在构建一个 WPF 窗口,其中包含一个使用 DataGrid 的表。绑定和更新工作正常,我也很鄙视样式,但在选择时遇到了麻烦。这是先决条件:
表是只读的 整行选择这是我的表格的源代码:(是的,我知道我确实设置了 3 次选择颜色,一次用于 DataGrid,一次用于行,一次用于单元格。我认为其中一个可能会有所帮助,但事实并非如此。)
<DataGrid x:Name="dgv" SelectionMode="Single" SelectionUnit="FullRow" AutoGenerateColumns="False" Grid.Column="0" Grid.RowSpan="3" Margin="8" RowHeight="32" GridLinesVisibility="Horizontal" HeadersVisibility="Column" HorizontalScrollBarVisibility="Hidden"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserReorderColumns="False"
CanUserResizeColumns="False"
CanUserResizeRows="False"
CanUserSortColumns="True"
IsReadOnly="True"
LoadingRow="dgv_LoadingRow"
>
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Style.Resources>
<SolidColorBrush x:Key="x:Static SystemColors.HighlightBrushKey" Color="Red"></SolidColorBrush>
</Style.Resources>
<Setter Property="VerticalAlignment" Value="center"></Setter>
<Setter Property="Padding" Value="4"></Setter>
<Setter Property="Margin" Value="4"></Setter>
</Style>
</DataGrid.CellStyle>
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Style.Resources>
<SolidColorBrush x:Key="x:Static SystemColors.HighlightBrushKey" Color="Red"></SolidColorBrush>
</Style.Resources>
</Style>
</DataGrid.RowStyle>
<DataGrid.Style>
<Style TargetType="DataGrid">
<Style.Resources>
<SolidColorBrush x:Key="x:Static SystemColors.HighlightBrushKey" Color="Red"></SolidColorBrush>
</Style.Resources>
</Style>
</DataGrid.Style>
然后继续 Column- 和 RowDefinitions ...
我遇到以下问题:
只有单元格被选中,而不是整行。单元格中的边距使它看起来很奇怪(见截图) 当我单击单元格的边缘(屏幕截图中未显示为红色的区域)时,该行未选择 - 使选择行变得非常不直观... 我单击以选择行的单元格仍然突出显示(注意所选行中“Peter Müller”周围的黑色边框)这是结果的截图:
【问题讨论】:
好吧,我想既然没有人想出任何不同的方法,我将不得不使用编程方法并对 selectionChanged 事件做出反应...... 【参考方案1】:如果您要删除单元格定义中的边距怎么办?这说明了单元格占用了额外的空间,而红色没有覆盖该空间。如果您删除了边距,您是否得到了您正在寻找的东西。我认为真正的答案可能在DataGrid.RowBackground
[Property][1] 中。
物业价值 类型:System.Windows.Media.Brush 绘制行背景的画笔。注册的默认值为空。有关可能影响值的更多信息,请参阅 DependencyProperty。
您可以在 IsSelected 状态上使用触发器来设置颜色。默认情况下,DataGrid 的整行都被选中。
<DataGrid Name="dataGrid1" Margin="12,12,0,0">
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Background" Value="LightBlue" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
</DataGrid>
【讨论】:
这不起作用,因为 DataGridRow 的控件模板会更改模板内部的 Border 的背景,而不是 DataGridRow 本身的背景... [blogs.msdn.com/b/wpfsdk/archive/2007/08/31/… 这很奇怪......我现在得到了相同的结果。尽管如此,您的方法仍然无效,不幸的是它甚至没有切换“选择”颜色或背景颜色。基本上好像这段代码由于某种原因没有被解释......【参考方案2】:为了更改默认背景行选择。你需要 1)编辑datagridrow样式和模板(即http://msdn.microsoft.com/en-us/library/cc278066%28v=vs.95%29.aspx) 2) 处理 selectionchanged 事件和改变行的背景。 3)或在数据网格行加载事件中获取等于“BackgroundRectangle”的childrenoftype矩形并设置您想要的颜色 - 因此使用它会影响数据网格中的所有行,它类似于1但在代码后面执行此操作。
希望这能给你一些想法。
【讨论】:
以上是关于选择后更改整个数据网格行的背景颜色的主要内容,如果未能解决你的问题,请参考以下文章