web-dev-qa-db-fra.com

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

Cela semble être une évidence, mais je ne vois tout simplement pas comment le faire.

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 un moyen de passer outre?

J'ai essayé ceci (modifié à partir du lien 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>

Mais toujours rien ...

119
Jan Bannister

Je l'ai. Ajoutez les éléments suivants 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>
93
Jan Bannister

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 ceci à votre DataGrid. Vous pouvez le changer d'un SolidColorBrush à un autre pinceau tel qu'un dégradé linéaire.

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

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 à l'aide de la méthode Style suivante:

<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 entrer les couleurs que vous préférez. Ceci Style fonctionnera également pour d’autres éléments de la collection tels que ListBoxItems (si vous remplacez TargetType="{x:Type DataGridRow}" avec TargetType="{x:Type ListBoxItem}" par exemple).

70
Sheridan

J'ai eu ce problème et j'ai presque déchiré mes 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. Ça ne suffirait pas. Dans mon cas, la raison était que j'avais également un CellStyle dans ma grille de données et que CellStyle remplaçait le RowStyle que je définissais. Il est intéressant de noter que CellStyle ne définissait même pas la couleur d’arrière-plan, qui était plutôt 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 ne fonctionnait pas du tout quand j'ai fait ceci:

        <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 en dehors du style de ligne et dans le style de cellule, comme suit:

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

18
J S

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

Une partie de la raison pour laquelle j'ai vécu l'événement sélectionné par la ligne sélectionnée ne fonctionne pas

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

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

J'ai essayé ControlBrushKey mais cela n'a pas fonctionné pour les lignes non sélectionnées. Le fond de la ligne non sélectionnée était toujours blanc. Mais j'ai réussi à découvrir que je devais 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>
5
Kenneth Zhang

J'ai passé la plus grande partie de la journée à régler ce problème. En fait, la propriété RowBackground sur le DataGrid - que j'avais définie - annulait toutes les tentatives de modification. Dès que je l'ai supprimé, tout a fonctionné. (Par ailleurs, il en va de même pour le premier plan défini dans DataGridTextColumn).

2
user947737