Comment puis-je définir la couleur d'une ligne sélectionnée dans DataGrid

127

La couleur d'arrière-plan par défaut d'une ligne sélectionnée dans DataGrid est si sombre que je ne peux pas la lire. Y a-t-il moyen de le contourner?

J'ai essayé ça

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

Mais toujours rien ...

Jan Bannister
la source
Quand vous dites «essayé ceci», vous voulez dire que vous avez essayé cela et que cela n'a pas fonctionné?
Colonel Panic
2
Oui, c'est ce que cela signifie @ColonelPanic
co2f2e

Réponses:

156

La solution ci-dessus a laissé une bordure bleue autour de chaque cellule dans mon cas.

C'est la solution qui a fonctionné pour moi. C'est très simple, ajoutez simplement ceci à votre DataGrid. Vous pouvez le changer de a SolidColorBrushà n'importe quel autre pinceau tel qu'un dégradé linéaire.

<DataGrid.Resources>
  <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
                   Color="#FF0000"/>
</DataGrid.Resources>
Seb Kade
la source
Parfait - exactement ce dont j'avais besoin. M'a permis de continuer à référencer un style existant pour le DG et de changer le pinceau d'arrière-plan pour une ligne sélectionnée.
Gatmando
5
blessé. Une idée sur la façon de faire de même pour la couleur de premier plan?
Arsen Zahray
8
Arsen, remplacez simplement le pinceau pour SystemColors.HighlightTextBrushKey de la même manière pour définir la couleur du texte.
Ben McIntosh
Si je sélectionne la ligne entière via Databinding, par exemple, <DataGrid>ItemsSource="{Binding Path=MySelector}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}"la ligne est uniquement LightGrey. Existe-t-il également un SystemColors? ´
Rolfi
6
Enfin trouvé une si elle n'a pas le focus: SystemColors.ControlBrushKey.
Rolfi
100

Je l'ai. Ajoutez ce qui suit dans la section 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
la source
C'est génial, je viens de tomber dessus et je devenais frustré :-)
Rob
6
Dans quelle section mettez-vous cela?
Colonel Panic
7
Puisque le BorderBrushreste bleu, s'il ennuie quelqu'un, ajoutez simplement un autre Setterélément, qui définit la BorderBrushpropriété de dépendance sur la même couleur (valeur) que le Backgroundlui - même.
kai
75

En complément de la réponse de @Seb Kade, vous pouvez contrôler entièrement les couleurs des lignes sélectionnées et non sélectionnées en utilisant les éléments suivants 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>

Vous pouvez bien sûr saisir les couleurs que vous préférez. Cela Stylefonctionnera également pour d'autres éléments de collection tels que ListBoxItems (si vous remplacez TargetType="{x:Type DataGridRow}"par TargetType="{x:Type ListBoxItem}"par exemple).

Sheridan
la source
6
Votre solution est la meilleure.
Développeur
Bien, Sheridan. Je veux également la couleur de premier plan de ma ligne sur la ligne sélectionnée. mais il prend par défaut HighlightTextBrushKey (ie noir). Que faire?
deathrace
1
@ deathrace.dj, si je vous comprends bien, il vous suffit de changer la Colorpropriété du troisième SolidColorbrushdans mon exemple en la couleur que vous aimez. L'utilisation de cette déclaration est en fait la définition de la couleur de SolidColorbrushcelle SystemColors.HighlightTextBrushKeyutilisée. Attention cependant à ne pas avoir défini la Foregroundcouleur Styleailleurs car cela peut remplacer les paramètres Resourcesci - dessus.
Sheridan
Merci, c'est exactement ce que je cherchais!
Enrico
Vous pouvez également définir un pinceau transparent pour SystemColors.InactiveSelectionHighlightBrushKey, ou la ligne sera mise en surbrillance lorsque la grille perd le focus
dlf
19

J'ai eu ce problème et j'ai failli m'arracher les cheveux, et je n'ai pas pu trouver la réponse appropriée sur le net. J'essayais de contrôler la couleur d'arrière-plan de la ligne sélectionnée dans un WPF DataGrid. Cela ne le ferait tout simplement pas. Dans mon cas, la raison était que j'avais également un CellStyle dans ma grille de données, et que CellStyle a remplacé le RowStyle que je définissais. Fait intéressant, car CellStyle ne définissait même pas la couleur d'arrière-plan, qui était à la place définie par les propriétés RowBackground et AlternateRowBackground. Néanmoins, essayer de définir la couleur d'arrière-plan de la ligne sélectionnée n'a pas du tout fonctionné lorsque j'ai fait cela:

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

et cela a fonctionné lorsque j'ai déplacé le style souhaité pour la ligne sélectionnée hors du style de ligne et dans le style de cellule, comme ceci:

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

Il suffit de poster ceci au cas où quelqu'un aurait le même problème.

JS
la source
Cela se produit à chaque fois, la cellule définit un premier plan et chaque corps cible la ligne.
eran otzap
1
J'ai rencontré cela aussi, et je ne suis même pas en train de définir un CellStyle. Lorsque j'ai essayé de définir cela sur le style de ligne, cela n'affectait que les éléments non cellulaires.
BigSandwich
12

Le déclencheur IsSelected par défaut modifie 3 propriétés, Background, Foreground & BorderBrush. Si vous souhaitez modifier la bordure ainsi que l'arrière-plan, incluez-le simplement dans votre déclencheur de style.

<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
la source
@Mark H, plutôt que d'apporter des changements majeurs à cette réponse aussi tard dans le jeu, vous devriez ajouter votre propre réponse.
Michael Petrotta
9

Certaines des raisons pour lesquelles j'ai rencontré l'événement sélectionné par ligne ne fonctionnaient pas

  1. Le style est configuré pour DataGridCell
  2. Utilisation de colonnes basées sur des modèles
  3. Le déclencheur est configuré au DataGridRow

C'est ce qui m'a aidé. Définition du style de 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>

Et comme j'utilisais une colonne de modèle avec une étiquette à l'intérieur, j'ai lié la propriété Foreground au conteneur Foreground à l'aide de la liaison 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
la source
4

J'ai essayé ControlBrushKey mais cela n'a pas fonctionné pour les lignes non sélectionnées. L'arrière-plan de la ligne non sélectionnée était toujours blanc. Mais j'ai réussi à découvrir que je dois remplacer le style de ligne.

<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
la source
2

J'ai passé la majeure partie de la journée à tripoter ce problème. Il s'est avéré que la propriété RowBackground sur le DataGrid - que j'avais définie - remplaçait toutes les tentatives de modification. Dès que je l'ai supprimé, tout a fonctionné. (Il en va de même pour le premier plan défini dans DataGridTextColumn, au fait).

user947737
la source