2009-08-03 21 views
104
setzen

Dies scheint wie ein Kinderspiel, aber ich kann einfach nicht sehen, wie es geht.Wie kann ich die Farbe einer ausgewählten Zeile in DataGrid

Die Standardhintergrundfarbe einer ausgewählten Zeile in DataGrid ist so dunkel, dass ich sie nicht lesen kann. Gibt es überhaupt einen Vorrang?

diese Versuchte (modifiziert nach Neverminds Link)

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

aber noch nichts ...

+0

Wenn Sie sagen, ‚das versucht, "Du meinst du hast es versucht und es hat nicht funktioniert? –

+1

Ja, das ist es, was es bedeutet @ColonPanic – Kalanamith

Antwort

78

Verstanden. Fügen Sie Folgendes im Abschnitt DataGrid.Resources hinzu:

+0

Das ist großartig, ich lief einfach in das und ich wurde frustriert :-) –

+5

In welchem ​​Abschnitt steckst du das? –

+2

Da der 'BorderBrush' blau bleibt, fügen Sie einfach ein weiteres' Setter'-Element hinzu, das die Abhängigkeitseigenschaft 'BorderBrush' auf die gleiche Farbe (Wert) wie den 'Background' selbst setzt. – KAI

135

Die obige Lösung ließ in meinem Fall blauen Rand um jede Zelle.

Dies ist die Lösung, die für mich arbeitete. Es ist sehr einfach, fügen Sie das einfach zu Ihrem DataGrid hinzu. Sie können es von einem SolidColorBrush zu jedem anderen Pinsel wie linearem Farbverlauf ändern.

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

Nice Hack! funktioniert ganz gut – TerrorAustralis

+0

Perfekt - genau das, was ich brauchte. Erlaubt mir, weiterhin auf einen vorhandenen Stil für die DG zu verweisen und den Hintergrundpinsel für eine ausgewählte Zeile zu ändern. – Gatmando

+0

Schön gemacht! Danke – SamChen

12

Der Standard IsSelected Trigger ändert 3 Eigenschaften, Hintergrund, Vordergrund & BorderBrush. Wenn Sie sowohl den Rahmen als auch den Hintergrund ändern möchten, fügen Sie dies einfach in Ihren Style-Trigger ein.

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

@Mark H, anstatt große Änderungen an dieser Antwort so spät im Spiel, sollten Sie Ihre eigene Antwort hinzufügen. –

59

Als Erweiterung Kade Antwort auf @Seb, können Sie in vollem Umfang die Farben der ausgewählten und nicht ausgewählten Zeilen steuern die folgenden Style mit:

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

Sie können natürlich geben je nachdem, welche Farben, die Sie bevorzugen. Diese Style funktioniert auch für andere Sammlungselemente wie ListBoxItem s (wenn Sie zum Beispiel TargetType="{x:Type DataGridRow}" durch ersetzen).

+4

Ihre Lösung ist die beste. –

+0

Schön, Sheridan. Ich möchte auch die Vordergrundfarbe meiner Zeile in der ausgewählten Zeile. aber es dauert default HighlightTextBrushKey (d. h. schwarz). was ist zu tun? – deathrace

+1

@ deathrace.dj, Wenn ich Sie richtig verstehe, dann müssen Sie nur die 'Color' Eigenschaft der dritten' SolidColorBrush' in meinem Beispiel in die Farbe ändern, die Sie mögen. Mit dieser Deklaration wird tatsächlich die Farbe des 'SolidColorBrush' festgelegt, die der' SystemColors.HighlightTextBrushKey' verwendet. Achten Sie jedoch darauf, dass Sie die 'Vordergrund'-Farbe in einem anderen' Stil' nicht anderswo eingestellt haben, da dies die Einstellungen in den 'Ressourcen' übersteuern kann. – Sheridan

13

Ich hatte dieses Problem und ich riss mir fast die Haare aus, und ich konnte nicht die passende Antwort im Netz finden. Ich habe versucht, die Hintergrundfarbe der ausgewählten Zeile in einem WPF DataGrid zu steuern. Es würde es einfach nicht tun. In meinem Fall war der Grund, dass ich auch einen CellStyle in meinem Datagrid hatte und der CellStyle den RowStyle überschrieb, den ich einstellte. Interessanterweise, weil der CellStyle nicht einmal die Hintergrundfarbe einstellte, die stattdessen von den Eigenschaften RowBackground und AlternateRowBackground gesetzt wurde. Dennoch versucht, die Hintergrundfarbe der ausgewählten Zeile zu setzen überhaupt nicht funktionieren, wenn ich dies tat:

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

und es hat funktioniert, wenn ich den gewünschten Stil für die ausgewählte Zeile aus der Reihe Stil bewegt und in der Zellenstil, wie folgt:

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

Einfach dieses, wenn jemand das gleiche Problem hat.

+0

Dies passiert jedes Mal, wenn die Zelle einen Vordergrund setzt und jeder Körper auf die Reihe zielt. –

+1

Ich bin auch darauf gestoßen, und ich setze nicht einmal einen CellStyle. Als ich versuchte, dies auf den Zeilenstil zu setzen, traf dies nur die Nicht-Zellen-Elemente. – BigSandwich

4

Ich habe versucht, ControlBrushKey, aber es funktioniert nicht für nicht ausgewählte Zeilen. Der Hintergrund für die nicht ausgewählte Zeile war immer noch weiß. Aber ich habe herausgefunden, dass ich den Rowstyle überschreiben muss.

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

Ein Teil der Grund, den ich die Zeile ausgewählte Ereignis nicht

  1. Stil Arbeit falle eingerichtet ist für Datagridcell
  2. Mit Templated Spalten
  3. -Trigger wird am DataGridRow einrichten

Das hat mir geholfen. Einstellen der Stil für 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> 

Und da ich eine Vorlage Spalte mit einem Etikett nach innen unter Verwendung wurde, gebunden ich den Vordergrund Eigentum an den Behälter Vordergrund mit Relative Bindung:

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