如何在DataGrid中设置所选行的颜色


127

DataGrid中选定行的默认背景颜色太暗,以至于我无法读取它。无论如何有覆盖它吗?

试过这个

<dg:DataGrid.RowStyle>
    <Style TargetType="{x:Type dg:DataGridRow}">
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True" >
                <Setter Property="Background" Value="Gainsboro" />
            </Trigger>
        </Style.Triggers>
    </Style>
</dg:DataGrid.RowStyle>

但是还是没有


当您说“尝试过这个”时,您是说您尝试过了,但是没有成功?
上校惊慌

2
是的,这就是什么意思@ColonelPanic
co2f2e 2015年

Answers:


156

在我的情况下,上述解决方案在每个单元格周围都留下了蓝色边框。

这是对我有用的解决方案。非常简单,只需将其添加到中即可DataGrid。您可以将其从更改SolidColorBrush为任何其他画笔,例如线性渐变。

<DataGrid.Resources>
  <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
                   Color="#FF0000"/>
</DataGrid.Resources>

完美-正是我所需要的。请允许我继续引用DG的现有样式,并更改所选行的背景画笔。
加特曼多

5
完整的 关于如何对前景色做任何想法?
Arsen Zahray 2012年

8
Arsen,只需以相同的方式覆盖SystemColors.HighlightTextBrushKey的笔刷来设置文本颜色。
Ben McIntosh 2012年

如果我确实通过数据绑定选择整个行,例如,<DataGrid>ItemsSource="{Binding Path=MySelector}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}"该行仅是LightGrey。还有SystemColors吗?“
Rolfi

6
最终找到了没有Focus的那个SystemColors.ControlBrushKey
罗尔菲

100

得到它了。在DataGrid.Resources部分中添加以下内容:

  <DataGrid.Resources>
     <Style TargetType="{x:Type dg:DataGridCell}">
        <Style.Triggers>
            <Trigger Property="dg:DataGridCell.IsSelected" Value="True">
                <Setter Property="Background" Value="#CCDAFF" />
            </Trigger>
        </Style.Triggers>
    </Style>
</DataGrid.Resources>

太好了,我刚遇到这个问题,便感到沮丧:-)
罗布

6
您将其放在哪一部分?
Panic Panic 2014年

7
由于BorderBrush其余部分保持蓝色,如果使人烦恼,则只需添加另一个Setter元素,即可将BorderBrush依赖项属性设置为与Background自身相同的颜色(值)。

75

作为对@Seb Kade答案的扩展,您可以使用以下命令完全控制选定行和未选定行的颜色Style

<Style TargetType="{x:Type DataGridRow}">
    <Style.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" />
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" />
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" />
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Black" />
    </Style.Resources>
</Style>

您当然可以输入喜欢的颜色。这Style也将为其他藏品的工作,如ListBoxItemS(如果更换TargetType="{x:Type DataGridRow}"TargetType="{x:Type ListBoxItem}"的实例)。


6
您的解决方案是最好的。
开发人员

很好,谢里登。我还希望我的行的前景色在选定的行上。但是它需要默认的HighlightTextBrushKey(即黑色)。该怎么办?
deathrace

1
@ deathrace.dj,如果我对您的理解正确,则只需将示例中Color第三个属性更改为SolidColorbrush您喜欢的任何颜色。使用该声明实际上是设置的颜色SolidColorbrushSystemColors.HighlightTextBrushKey用途。请注意,您尚未Foreground在其他Style地方设置颜色,因为这可能会覆盖Resources上面的设置。
谢里登

谢谢,这正是我想要的!
Enrico

您可能还想为设置透明笔刷SystemColors.InactiveSelectionHighlightBrushKey,否则当网格失去焦点时该行将突出显示
dlf 2016年

19

我遇到了这个问题,几乎把头发撕裂了,无法在网上找到合适的答案。我试图控制WPF DataGrid中所选行的背景颜色。它只是不会做。就我而言,原因是我的数据网格中也有一个CellStyle,而CellStyle覆盖了我正在设置的RowStyle。有趣的是,因为CellStyle甚至没有设置背景颜色,而是由RowBackground和AlternateRowBackground属性设置。但是,当我这样做时,尝试设置所选行的背景颜色根本不起作用:

        <DataGrid ... >
        <DataGrid.RowBackground>
            ...
        </DataGrid.RowBackground>
        <DataGrid.AlternatingRowBackground>
            ...
        </DataGrid.AlternatingRowBackground>
        <DataGrid.RowStyle>
            <Style TargetType="{x:Type DataGridRow}">
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background" Value="Pink"/>
                        <Setter Property="Foreground" Value="White"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </DataGrid.RowStyle>
        <DataGrid.CellStyle>
            <Style TargetType="{x:Type DataGridCell}">
                <Setter Property="Foreground" Value="{Binding MyProperty}" />
            </Style>
        </DataGrid.CellStyle>

当我将选定行的所需样式从行样式移到单元格样式时,它确实起作用了,如下所示:

    <DataGrid ... >
        <DataGrid.RowBackground>
            ...
        </DataGrid.RowBackground>
        <DataGrid.AlternatingRowBackground>
            ...
        </DataGrid.AlternatingRowBackground>
        <DataGrid.CellStyle>
            <Style TargetType="{x:Type DataGridCell}">
                <Setter Property="Foreground" Value="{Binding MyProperty}" />
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background" Value="Pink"/>
                        <Setter Property="Foreground" Value="White"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </DataGrid.CellStyle>

如果有人遇到相同的问题,只需发布​​此内容即可。


每次发生此情况时,单元格都会设置一个前景,每个主体都将目标行对准。
eran otzap 2014年

1
我也遇到了这个问题,甚至没有设置CellStyle。当我尝试在行样式上设置此样式时,它仅影响非单元格元素。
BigSandwich

12

默认的IsSelected触发器更改3个属性,即Background,Foreground和BorderBrush。如果要更改边框和背景,只需将其包括在样式触发器中即可。

<Style TargetType="{x:Type dg:DataGridCell}">
    <Style.Triggers>
        <Trigger Property="dg:DataGridCell.IsSelected" Value="True">
            <Setter Property="Background" Value="#CCDAFF" />
            <Setter Property="BorderBrush" Value="Black" />
        </Trigger>
    </Style.Triggers>
</Style>

@Mark H,而不是在游戏后期对这个答案进行重大更改,您应该添加自己的答案。
Michael Petrotta 2011年

9

我遇到行选择事件不起作用的某些原因

  1. 为DataGridCell设置样式
  2. 使用模板列
  3. 在DataGridRow上设置触发器

这就是帮助我的原因。设置DataGridCell的样式

<Style TargetType="{x:Type DataGridCell}">
  <Style.Triggers>
    <Trigger Property="IsSelected" Value="True">
      <Setter Property="Background" Value="Green"/>
      <Setter Property="Foreground" Value="White"/>
    </Trigger>
  </Style.Triggers> 
</Style>

由于我使用的模板列内部带有标签,因此我使用RelativeSource绑定将Foreground属性绑定到容器Foreground:

<DataGridTemplateColumn>
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
      <Label Content="{Binding CategoryName,
                 Mode=TwoWay,
                 UpdateSourceTrigger=LostFocus}"
             Foreground="{Binding Foreground,
                 RelativeSource={RelativeSource Mode=FindAncestor,
                     AncestorLevel=1, 
                     AncestorType={x:Type DataGridCell}}}"
             Width="150"/>
    </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

4

我已经尝试过ControlBrushKey,但是对于未选择的行却不起作用。未选择的行的背景仍然是白色。但是我设法发现我必须重写行样式。

<DataGrid x:Name="pbSelectionDataGrid" Height="201" Margin="10,0"
          FontSize="20" SelectionMode="Single" FontWeight="Bold">
    <DataGrid.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#FFFDD47C"/>
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="#FFA6E09C"/>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Red"/>
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Violet"/>
    </DataGrid.Resources>
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="Background" Value="LightBlue" />
        </Style>
    </DataGrid.RowStyle>
</DataGrid>

2

我一天的大部分时间都在摆弄这个问题。原来我设置的DataGrid的RowBackground属性覆盖了所有更改它的尝试。删除后,一切正常。(顺便说一句,DataGridTextColumn中设置的Foreground也是如此)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.