Como posso definir a cor de uma linha selecionada no DataGrid

127

A cor de fundo padrão de uma linha selecionada no DataGrid é tão escura que não consigo lê-la. Existe alguma maneira de substituí-lo?

Tentei isso

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

Mas ainda nada ...

Jan Bannister
fonte
Quando você diz 'tentou isso', quer dizer que tentou aquilo e não funcionou?
Coronel Panic
2
Sim, é isso que significa @ColonelPanic
co2f2e 4/15

Respostas:

155

A solução acima deixou uma borda azul ao redor de cada célula no meu caso.

Esta é a solução que funcionou para mim. É muito simples, basta adicionar isso ao seu DataGrid. Você pode alterá-lo de a SolidColorBrushpara qualquer outro pincel, como gradiente linear.

<DataGrid.Resources>
  <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
                   Color="#FF0000"/>
</DataGrid.Resources>
Seb Kade
fonte
Perfeito - exatamente o que eu precisava. Permitiu-me continuar a referenciar um estilo existente para a DG e alterar o pincel de segundo plano para uma linha selecionada.
Gatmando 6/01/11
5
feroz. Alguma idéia de como fazer o mesmo com a cor de primeiro plano?
Arsen Zahray
8
Arsen, substitua o pincel por SystemColors.HighlightTextBrushKey da mesma maneira para definir a cor do texto.
Ben McIntosh
Se eu selecionar a linha inteira através da ligação de dados, por exemplo, <DataGrid>ItemsSource="{Binding Path=MySelector}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}"a linha será apenas LightGrey. Existe também um SystemColors? ´
Rolfi 15/05
6
Finalmente encontrei a pessoa certa, se ele não tem foco: SystemColors.ControlBrushKey.
Rolfi
100

Entendi. Adicione o seguinte na seção 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
fonte
Isso é ótimo, eu apenas corri para este e eu estava ficando frustrado :-)
Rob
6
Em que seção você coloca isso?
Coronel Panic
7
Como o BorderBrushazul permanece, se isso incomoda alguém, basta adicionar outro Setterelemento, que define a BorderBrushpropriedade de dependência com a mesma cor (valor) da Backgroundmesma.
kai
75

Como extensão da resposta de @Seb Kade, você pode controlar totalmente as cores das linhas selecionadas e não selecionadas usando o seguinte 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>

Obviamente, você pode inserir as cores que preferir. Isso Styletambém funcionará para outros itens de coleção, como ListBoxItems (se você substituir TargetType="{x:Type DataGridRow}"por, TargetType="{x:Type ListBoxItem}"por exemplo).

Sheridan
fonte
6
Sua solução é a melhor.
Desenvolvedor
Legal Sheridan. Também quero a cor de primeiro plano da minha linha na linha selecionada. mas é preciso o HighlightTextBrushKey padrão (ou seja, preto). o que fazer?
deathrace
1
@ deathrace.dj, Se eu entendi direito, basta alterar a Colorpropriedade do terceiro SolidColorbrushno meu exemplo para a cor que você preferir. O uso desta declaração está na verdade definindo a cor usada SolidColorbrushpelos SystemColors.HighlightTextBrushKeyusuários. Tenha cuidado, porém, para não definir a Foregroundcor em outro local, Stylepois isso pode substituir as configurações Resourcesacima.
Sheridan
Obrigado, é exatamente isso que eu estava procurando!
Enrico
Você também pode querer definir um pincel transparente para SystemColors.InactiveSelectionHighlightBrushKey, ou a linha vai destacar quando a grade perde o foco
DLF
19

Eu tive esse problema e quase arranquei meu cabelo, e não consegui encontrar a resposta apropriada na rede. Eu estava tentando controlar a cor de fundo da linha selecionada em um WPF DataGrid. Simplesmente não faria isso. No meu caso, o motivo foi que eu também tinha um CellStyle no meu datagrid e o CellStyle substituiu o RowStyle que eu estava definindo. Curiosamente, porque o CellStyle nem estava definindo a cor do plano de fundo, que era configurada pelas propriedades RowBackground e AlternateRowBackground. No entanto, tentar definir a cor de fundo da linha selecionada não funcionou quando fiz isso:

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

e funcionou quando mudei o estilo desejado para a linha selecionada fora do estilo de linha e para o estilo de célula, da seguinte maneira:

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

Basta postar isso no caso de alguém ter o mesmo problema.

JS
fonte
Isso acontece sempre que a célula define um primeiro plano e todo corpo tem como alvo a linha.
eran otzap
1
Também me deparei com isso, e nem estou definindo um CellStyle. Quando tentei definir isso no estilo de linha, isso afetou apenas os elementos que não são de célula.
BigSandwich 25/09
12

O gatilho IsSelected padrão altera 3 propriedades, Background, Foreground e BorderBrush. Se você quiser alterar a borda e o plano de fundo, inclua isso no seu gatilho de 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
fonte
@ Mark H, em vez de fazer grandes alterações nesta resposta no final do jogo, você deve adicionar sua própria resposta.
Michael Petrotta
9

Alguns dos motivos pelos quais eu experimentei o evento selecionado de linha não estão funcionando

  1. O estilo está configurado para DataGridCell
  2. Usando colunas Templated
  3. O gatilho é configurado no DataGridRow

Foi isso que me ajudou. Definindo o 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>

E como eu estava usando uma coluna de modelo com um rótulo dentro, vinculei a propriedade Foreground ao contêiner Foreground usando a ligação 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
fonte
4

Eu tentei ControlBrushKey, mas não funcionou para linhas não selecionadas. O plano de fundo da linha não selecionada ainda estava branco. Mas eu consegui descobrir que tenho que substituir o estilo de linha.

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

Passei a maior parte de um dia brincando com esse problema. A propriedade RowBackground no DataGrid - que eu havia definido - acabou substituindo todas as tentativas de alterá-lo. Assim que eu apaguei, tudo funcionou. (O mesmo vale para o primeiro plano definido em DataGridTextColumn, a propósito).

user947737
fonte