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

cela semble évident, mais je ne vois pas comment faire.

la couleur de fond par défaut d'une rangée sélectionnée dans DataGrid est si sombre que je ne peux pas la lire. Est-il de toute façon de passer outre?

Essayé ce (modifiée à partir de Neverminds lien)

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

108
demandé sur H.B. 2009-08-03 20:28:41

8 réponses

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, il suffit d'ajouter ceci à votre DataGrid . Vous pouvez le changer d'un SolidColorBrush à n'importe quel autre pinceau tel que le gradient linéaire.

<DataGrid.Resources>
  <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
                   Color="#FF0000"/>
</DataGrid.Resources>
140
répondu Seb Kade 2014-04-02 21:41:51

compris. Ajouter ce qui suit dans le DataGrid.Section des ressources:

  <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>
84
répondu Jan Bannister 2015-06-10 20:31:22

comme extension à 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 le Style suivant:

<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 n'importe quelle couleur que vous préférez. Ce Style fonctionnera également pour d'autres articles de collection tels que ListBoxItem s (si vous remplacez TargetType="{x:Type DataGridRow}" par TargetType="{x:Type ListBoxItem}" par exemple).

64
répondu Sheridan 2012-03-09 11:59:18

j'ai eu ce problème et j'ai failli faire voler mes cheveux, et je n'ai pas pu trouver la réponse sur le net. J'essayais de contrôler la couleur de fond de la rangée sélectionnée dans un DataGrid WPF. Il n'aurait tout simplement pas le faire. Dans mon cas, la raison était que j'avais aussi une CellStyle dans mon datagrid, et la CellStyle a dépassé la RowStyle que je mettais. Il est intéressant de noter que, parce que la CellStyle n'était même pas la couleur de fond, qui était à la place Bing mis en place par le RowBackground et AlternateRowBackground properties. Néanmoins, essayer de régler la couleur de fond de la rangée choisie n'a pas fonctionné 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 il a fonctionné quand j'ai déplacé le style désiré pour la rangée sélectionnée hors du style de la rangée et dans le style de la cellule, comme cela:

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

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

14
répondu J S 2013-08-09 01:10:17

le trigger par défaut is-selected change 3 properties, Background, Foreground & BorderBrush. Si vous souhaitez modifier la frontière ainsi que l'arrière-plan, il suffit d'inclure dans votre style de déclenchement.

<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
répondu grantnz 2011-02-26 18:47:35

une partie de la raison pour laquelle j'ai éprouvé l'événement de ligne sélectionné ne fonctionne pas

  1. le Style est mis en place pour DataGridCell
  2. à l'aide de colonnes modelées
  3. Déclencheur est mis en place à la DataGridRow

C'est ce qui m'a aidé. Définir le 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 puisque j'utilisais une colonne de modèle avec une étiquette à l'intérieur, j'ai lié le De premier plan de la propriété pour le conteneur de premier plan à l'aide de RelativeSource de liaison:

<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
répondu Anupam Dutta 2016-12-27 11:07:16

J'ai essayé ControlBrushKey mais ça n'a pas marché pour les rangées non sélectionnées. L'arrière-plan de la rangée non sélectionnée était encore blanc. Mais j'ai réussi à découvrir que je dois passer outre la 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>
4
répondu Kenneth Zhang 2016-12-27 10:46:50

j'ai passé la plus grande partie de la journée à m'occuper de ce problème. Il s'est avéré que la propriété RowBackground sur le DataGrid - que j'avais défini-supplantait toutes les tentatives de le changer . Dès que je l'ai effacé, tout a fonctionné. (Idem pour le premier plan défini dans DataGridTextColumn, soit dit en passant).

1
répondu user947737 2018-07-14 17:02:47