Come posso impostare il colore di una riga selezionata in DataGrid


127

Il colore di sfondo predefinito di una riga selezionata in DataGrid è così scuro che non riesco a leggerlo. Esiste un modo per ignorarlo?

Ho provato questo

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

Ma ancora niente ...


Quando dici "provato questo" intendi che ci hai provato e non ha funzionato?
Colonnello Panic,

2
Sì, questo è ciò che significa @ColonelPanic
co2f2e

Risposte:


156

Nel mio caso la soluzione sopra ha lasciato un bordo blu attorno a ciascuna cella.

Questa è la soluzione che ha funzionato per me. È molto semplice, basta aggiungere questo al tuo DataGrid. Puoi cambiarlo da a SolidColorBrusha qualsiasi altro pennello come il gradiente lineare.

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

Perfetto - esattamente quello di cui avevo bisogno. Mi ha permesso di continuare a fare riferimento a uno stile esistente per il DG e modificare il pennello di sfondo per una riga selezionata.
Gatmando,

5
wounderfull. Qualche idea su come fare lo stesso per il colore di primo piano?
Arsen Zahray il

8
Arsen, basta sostituire il pennello per SystemColors.HighlightTextBrushKey nello stesso modo per impostare il colore del testo.
Ben McIntosh,

Se seleziono l'intera riga tramite Databinding, ad esempio <DataGrid>ItemsSource="{Binding Path=MySelector}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}"la riga è solo LightGrey. Esiste anche un SystemColors? ´
Rolfi,

6
Finalmente ho trovato l'uno se non ha Focus: SystemColors.ControlBrushKey.
Rolfi,

100

Fatto. Aggiungi quanto segue nella sezione 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>

È fantastico, mi sono appena imbattuto in questo e mi sentivo frustrato :-)
Rob,

6
In quale sezione lo metti?
Colonnello Panic,

7
Dato che BorderBrushrimane blu, se infastidisce qualcuno, aggiungi semplicemente un altro Setterelemento, che imposta la BorderBrushproprietà di dipendenza sullo stesso colore (valore) dello Backgroundstesso.
Kai,

75

Come estensione alla risposta di @Seb Kade, puoi controllare completamente i colori delle righe selezionate e non selezionate usando quanto segue 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>

Ovviamente puoi inserire qualsiasi colore tu preferisca. Questo Stylefunzionerà anche per altri elementi di raccolta come ListBoxItems (se si sostituisce TargetType="{x:Type DataGridRow}"con TargetType="{x:Type ListBoxItem}"ad esempio).


6
La tua soluzione è la migliore.
Sviluppatore,

Bello, Sheridan. Voglio anche il colore di primo piano della mia riga sulla riga selezionata. ma richiede HighlightTextBrushKey predefinito (ovvero nero). Cosa fare?
deathrace,

1
@ deathrace.dj, Se ti capisco correttamente, allora devi solo cambiare la Colorproprietà del terzo SolidColorbrushnel mio esempio in qualunque colore ti piaccia. L'uso di questa dichiarazione sta effettivamente impostando il colore di quello SolidColorbrushche SystemColors.HighlightTextBrushKeyutilizza. Fai attenzione, tuttavia, che non hai impostato il Foregroundcolore in un Stylealtro luogo poiché ciò può sovrascrivere le impostazioni Resourcessopra.
Sheridan,

Grazie, questo è esattamente quello che stavo cercando!
Enrico,

Potresti anche voler impostare un pennello trasparente per SystemColors.InactiveSelectionHighlightBrushKey, oppure la riga verrà evidenziata quando la griglia perde lo stato
attivo

19

Ho avuto questo problema e mi sono quasi strappato i capelli e non sono riuscito a trovare la risposta appropriata in rete. Stavo cercando di controllare il colore di sfondo della riga selezionata in un DataGrid WPF. Semplicemente non lo farebbe. Nel mio caso, la ragione era che avevo anche un CellStyle nel mio datagrid, e il CellStyle scavalcava il RowStyle che stavo impostando. È interessante notare che, poiché CellStyle non stava nemmeno impostando il colore di sfondo, che era invece impostato dalle proprietà RowBackground e AlternateRowBackground. Tuttavia, provare a impostare il colore di sfondo della riga selezionata non ha funzionato affatto quando ho fatto questo:

        <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 ha funzionato quando ho spostato lo stile desiderato per la riga selezionata fuori dallo stile della riga e nello stile della cella, in questo modo:

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

Pubblicando questo nel caso in cui qualcuno abbia lo stesso problema.


Questo accade ogni volta, la cella imposta un primo piano e ogni corpo prende di mira la riga.
Eran Otzap,

1
Mi sono imbattuto anche in questo e non sto nemmeno impostando un CellStyle. Quando ho provato a impostare questo sullo stile di riga, ha interessato solo gli elementi non cellulari.
BigSandwich,

12

Il trigger IsSelected predefinito modifica 3 proprietà, Sfondo, Primo piano e BorderBrush. Se si desidera modificare il bordo e lo sfondo, è sufficiente includerlo nel trigger di stile.

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

@Mark H, piuttosto che apportare importanti modifiche a questa risposta a fine partita, dovresti aggiungere la tua risposta.
Michael Petrotta,

9

Alcuni dei motivi per cui ho riscontrato che l'evento selezionato sulla riga non funziona

  1. Lo stile è impostato per DataGridCell
  2. Utilizzo di colonne basate su modelli
  3. Il trigger è impostato su DataGridRow

Questo è ciò che mi ha aiutato. Impostazione dello stile per 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 poiché stavo usando una colonna modello con un'etichetta all'interno, ho associato la proprietà Foreground al contenitore Foreground usando l'associazione 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>

4

Ho provato ControlBrushKey ma non ha funzionato per le righe non selezionate. Lo sfondo per la riga non selezionata era ancora bianco. Ma sono riuscito a scoprire che devo scavalcare lo stile di riga.

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

2

Ho trascorso gran parte della giornata a giocherellare con questo problema. Ho scoperto che la proprietà RowBackground su DataGrid - che avevo impostato - stava ignorando tutti i tentativi di modifica. Non appena l'ho cancellato, tutto ha funzionato. (Lo stesso vale per Foreground impostato in DataGridTextColumn, tra l'altro).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.