¿Cómo puedo establecer el color de una fila seleccionada en DataGrid?

127

El color de fondo predeterminado de una fila seleccionada en DataGrid es tan oscuro que no puedo leerlo. ¿Hay alguna forma de anularlo?

Probé esto

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

Pero aún nada ...

Jan Bannister
fuente
Cuando dices 'probé esto', ¿quieres decir que intentaste eso y no funcionó?
Coronel Panic
2
Sí, eso es lo que significa @ColonelPanic
co2f2e

Respuestas:

156

La solución anterior dejó un borde azul alrededor de cada celda en mi caso.

Esta es la solución que funcionó para mí. Es muy simple, solo agregue esto a su DataGrid. Puede cambiarlo de a SolidColorBrusha cualquier otro pincel, como un degradado lineal.

<DataGrid.Resources>
  <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
                   Color="#FF0000"/>
</DataGrid.Resources>
Seb Kade
fuente
Perfecto, exactamente lo que necesitaba. Me permitió continuar haciendo referencia a un estilo existente para el DG y cambiar el pincel de fondo para una fila seleccionada.
Gatmando
55
Wounderfull. ¿Alguna idea sobre cómo hacer lo mismo con el color frontal?
Arsen Zahray
8
Arsen, simplemente anule el pincel para SystemColors.HighlightTextBrushKey de la misma manera para establecer el color del texto.
Ben McIntosh
Si selecciono la fila completa a través de Databinding, por ejemplo, <DataGrid>ItemsSource="{Binding Path=MySelector}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}"la fila es solo LightGrey. ¿Existe también un SystemColors? ´
Rolfi
66
Finalmente encontrado el uno si no tiene Enfoque: SystemColors.ControlBrushKey.
Rolfi
100

Entendido. Agregue lo siguiente dentro de la sección 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>
Jan Bannister
fuente
Esto es genial, me encontré con esto y me estaba frustrando :-)
Rob
66
¿En qué sección pones eso?
Coronel Panic
77
Dado que BorderBrushpermanece azul, si molesta a alguien, simplemente agregue otro Setterelemento, que establece la BorderBrushpropiedad de dependencia con el mismo color (valor) que el Backgroundpropio.
kai
75

Como extensión de la respuesta de @Seb Kade, puede controlar completamente los colores de las filas seleccionadas y no seleccionadas utilizando lo siguiente 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>

Por supuesto, puede ingresar los colores que prefiera. Esto Styletambién funcionará para otros elementos de colección como ListBoxItems (si reemplaza TargetType="{x:Type DataGridRow}"con, TargetType="{x:Type ListBoxItem}"por ejemplo).

Sheridan
fuente
66
Tu solución es la mejor.
Desarrollador
Bien Sheridan. También quiero el color de primer plano de mi fila en la fila seleccionada. pero toma HighlightTextBrushKey predeterminado (es decir, negro). ¿qué hacer?
Deathrace
1
@ deathrace.dj, si te entiendo correctamente, entonces solo necesitas cambiar la Colorpropiedad del tercero SolidColorbrushen mi ejemplo al color que quieras. El uso de esta declaración es en realidad establecer el color del SolidColorbrushque SystemColors.HighlightTextBrushKeyutiliza. Sin embargo, tenga cuidado de no haber configurado el Foregroundcolor en otro Stylelugar, ya que esto puede anular la configuración de lo Resourcesanterior.
Sheridan
¡Gracias, esto es exactamente lo que estaba buscando!
Enrico
También es posible que desee establecer un pincel transparente para SystemColors.InactiveSelectionHighlightBrushKey, o la fila se resaltará cuando la cuadrícula pierda el foco
dlf
19

Tuve este problema y casi me arranqué el pelo, y no pude encontrar la respuesta adecuada en la red. Estaba tratando de controlar el color de fondo de la fila seleccionada en un WPF DataGrid. Simplemente no lo haría. En mi caso, la razón fue que también tenía un CellStyle en mi cuadrícula de datos, y el CellStyle anuló el RowStyle que estaba configurando. Curiosamente, porque CellStyle ni siquiera estaba configurando el color de fondo, que en su lugar era bing establecido por las propiedades RowBackground y AlternateRowBackground. Sin embargo, intentar establecer el color de fondo de la fila seleccionada no funcionó cuando hice esto:

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

y funcionó cuando moví el estilo deseado para la fila seleccionada fuera del estilo de fila y al estilo de celda, así:

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

Solo publica esto en caso de que alguien tenga el mismo problema.

JS
fuente
Esto sucede cada vez, la celda establece un primer plano y cada cuerpo apunta a la fila.
eran otzap
1
Me encontré con esto también, y ni siquiera estoy configurando un CellStyle. Cuando intenté establecer esto en el estilo de fila, solo afectó a los elementos que no son celdas.
BigSandwich
12

El activador predeterminado IsSelected cambia 3 propiedades, Fondo, Primer plano y Borde de borde. Si desea cambiar el borde y el fondo, simplemente inclúyalo en su estilo.

<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>
Grantnz
fuente
@ Mark H, en lugar de hacer cambios importantes en esta respuesta tan tarde en el juego, debes agregar tu propia respuesta.
Michael Petrotta
9

Algunas de las razones por las que experimenté el evento de fila seleccionada no funcionan

  1. El estilo está configurado para DataGridCell
  2. Usar columnas templadas
  3. El activador se configura en DataGridRow

Esto es lo que me ayudó. Establecer el estilo para 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>

Y como estaba usando una columna de plantilla con una etiqueta dentro, vinculé la propiedad de primer plano al primer plano del contenedor usando el enlace RelativeSource:

<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>
Anupam Dutta
fuente
4

Intenté ControlBrushKey pero no funcionó para filas no seleccionadas. El fondo de la fila no seleccionada seguía siendo blanco. Pero me las he arreglado para descubrir que tengo que anular el estilo de fila.

<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>
Kenneth Zhang
fuente
2

Pasé la mayor parte del día jugando con este problema. Resultó que la propiedad RowBackground en DataGrid, que había configurado, anulaba todos los intentos de cambiarla. Tan pronto como lo eliminé, todo funcionó. (Por cierto, lo mismo ocurre con el primer plano establecido en DataGridTextColumn).

usuario947737
fuente