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

时间:2009-08-03 16:28:41

标签: c# wpf xaml datagrid

这似乎不费吹灰之力,但我只是看不出怎么做。

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

试过这个(从Neverminds链接修改)

<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>

但仍然没有...

8 个答案:

答案 0 :(得分:144)

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

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

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

答案 1 :(得分:92)

知道了。在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>

答案 2 :(得分:68)

作为@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也适用于其他收集项目,例如ListBoxItem s(例如,如果您将TargetType="{x:Type DataGridRow}"替换为TargetType="{x:Type ListBoxItem}")。

答案 3 :(得分:16)

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

        <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>

只是发布此内容以防有人遇到同样的问题。

答案 4 :(得分:12)

默认的IsSelected触发器会更改3个属性,Background,Foreground&amp; 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>

答案 5 :(得分:9)

我遇到行选择事件无法正常工作的部分原因

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

    这对我有所帮助。设置DataGridCell的样式

    from sqlalchemy.sql import func as sa_func
    
    query = ItemList.query.with_entities(ItemList.itemid)
    query = query.outerjoin(ItemTransactions, ItemTransactions.itemid == ItemList.itemid)
    query = query.add_columns(sa_func.sum(ItemList.quantitySold).label('total_quantity_sold'))
    query = query.add_columns(sa_func.max(ItemTransactions.createdAt).label('last_sale_time'))
    query = query.filter(ItemList.active == "y")
    query = query.group_by(ItemList.itemid)
    query = query.order_by(sa_func.sum(ItemList.quantitySold).asc())
    
    if limit is not None and limit is not 0:
        query = query.limit(limit)
    if offset is not None:
        query = query.offset(offset)
    
    # Execute the query
    sales = query.all()
    

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

    <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>
    

答案 6 :(得分:5)

我已经尝试过ControlBrushKey,但它对未选择的行没有效果。未选择行的背景仍为白色。但是我设法发现我必须覆盖rowstyle。

<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>

答案 7 :(得分:2)

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