Wie kann ich die Farbe einer ausgewählten Zeile in DataGrid festlegen?

127

Die Standardhintergrundfarbe einer ausgewählten Zeile in DataGrid ist so dunkel, dass ich sie nicht lesen kann. Gibt es überhaupt eine Möglichkeit, es zu überschreiben?

Versuchte dies

<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 immer noch nichts ...

Jan Bannister
quelle
Wenn Sie sagen, dass Sie es versucht haben, meinen Sie, dass Sie es versucht haben und es nicht funktioniert hat?
Colonel Panic
2
Ja das ist was es bedeutet @ColonelPanic
co2f2e

Antworten:

155

Die obige Lösung hat in meinem Fall einen blauen Rand um jede Zelle hinterlassen.

Dies ist die Lösung, die für mich funktioniert hat. Es ist sehr einfach, fügen Sie dies einfach zu Ihrem hinzu DataGrid. Sie können es von einem SolidColorBrushzu einem anderen Pinsel ändern, z. B. einem linearen Farbverlauf.

<DataGrid.Resources>
  <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
                   Color="#FF0000"/>
</DataGrid.Resources>
Seb Kade
quelle
Perfekt - genau das, was ich brauchte. Ich durfte weiterhin auf einen vorhandenen Stil für die DG verweisen und den Hintergrundpinsel für eine ausgewählte Zeile ändern.
Gatmando
5
wunderbar. Haben Sie eine Idee, wie Sie das Gleiche mit der Vordergrundfarbe tun können?
Arsen Zahray
8
Arsen, überschreiben Sie einfach den Pinsel für SystemColors.HighlightTextBrushKey auf die gleiche Weise, um die Textfarbe festzulegen.
Ben McIntosh
Wenn ich die gesamte Zeile über <DataGrid>ItemsSource="{Binding Path=MySelector}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}"die Datenbindung auswähle, ist die Zeile beispielsweise nur LightGrey. Gibt es auch ein SystemColors? ´
Rolfi
6
Endlich den gefunden, wenn er keinen Fokus hat : SystemColors.ControlBrushKey.
Rolfi
100

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

  <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
quelle
Das ist großartig, ich bin gerade darauf gestoßen und war frustriert :-)
Rob
6
In welchen Abschnitt steckst du das?
Colonel Panic
7
Da das BorderBrushblau bleibt, wenn es jemanden nervt, fügen Sie einfach ein weiteres SetterElement hinzu, das die BorderBrushAbhängigkeitseigenschaft auf dieselbe Farbe (Wert) wie das Backgroundselbst setzt.
Kai
75

Als Erweiterung der Antwort von @Seb Kade können Sie die Farben der ausgewählten und nicht ausgewählten Zeilen wie folgt vollständig steuern 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>

Sie können natürlich die von Ihnen bevorzugten Farben eingeben. Dies Stylewird auch für andere Kollektionsteile arbeiten wie ListBoxItems (wenn Sie ersetzen TargetType="{x:Type DataGridRow}"mit TargetType="{x:Type ListBoxItem}"zum Beispiel).

Sheridan
quelle
6
Ihre Lösung ist die beste.
Entwickler
Schön, Sheridan. Ich möchte auch die Vordergrundfarbe meiner Zeile für die ausgewählte Zeile. Es wird jedoch standardmäßig HighlightTextBrushKey (dh schwarz) verwendet. was ist zu tun?
Deathrace
1
@ deathrace.dj, Wenn ich Sie richtig verstehe, müssen Sie nur die ColorEigenschaft des dritten SolidColorbrushin meinem Beispiel auf die gewünschte Farbe ändern . Durch die Verwendung dieser Deklaration wird tatsächlich die Farbe SolidColorbrushder SystemColors.HighlightTextBrushKeyverwendeten Deklaration festgelegt . Achten Sie jedoch darauf, dass Sie die ForegroundFarbe nicht an einer anderen StyleStelle eingestellt haben, da dies die Resourcesobigen Einstellungen überschreiben kann .
Sheridan
Danke, genau das habe ich gesucht!
Enrico
Möglicherweise möchten Sie auch einen transparenten Pinsel für festlegen SystemColors.InactiveSelectionHighlightBrushKey, oder die Zeile wird hervorgehoben, wenn das Raster den Fokus verliert
dlf
19

Ich hatte dieses Problem und riss mir fast die Haare aus, und ich konnte im Internet keine passende Antwort 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 von mir eingestellten RowStyle überschrieb. Interessanterweise, weil der CellStyle nicht einmal die Hintergrundfarbe festlegte, die stattdessen durch die Eigenschaften RowBackground und AlternateRowBackground festgelegt wurde. Der Versuch, die Hintergrundfarbe der ausgewählten Zeile festzulegen, funktionierte dabei jedoch überhaupt nicht:

        <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, als ich den gewünschten Stil für die ausgewählte Zeile aus dem Zeilenstil in den Zellenstil verschoben habe, 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>

Posten Sie dies einfach, falls jemand das gleiche Problem hat.

JS
quelle
Dies geschieht jedes Mal, wenn die Zelle einen Vordergrund setzt und jeder Körper auf die Zeile zielt.
eran otzap
1
Ich bin auch darauf gestoßen und stelle nicht einmal einen CellStyle ein. Als ich versuchte, dies für den Zeilenstil festzulegen, wirkte sich dies nur auf die Nichtzellenelemente aus.
BigSandwich
12

Der Standard-IsSelected-Trigger ändert drei Eigenschaften: Hintergrund, Vordergrund und BorderBrush. Wenn Sie sowohl den Rand als auch den Hintergrund ändern möchten, fügen Sie dies einfach in Ihren Stilauslöser 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>
grantnz
quelle
@Mark H, anstatt so spät im Spiel größere Änderungen an dieser Antwort vorzunehmen, sollten Sie Ihre eigene Antwort hinzufügen.
Michael Petrotta
9

Einige der Gründe, aus denen ich festgestellt habe, dass das in der Zeile ausgewählte Ereignis nicht funktioniert

  1. Der Stil ist für DataGridCell eingerichtet
  2. Verwenden von Spalten mit Vorlagen
  3. Der Trigger wird in der DataGridRow eingerichtet

Das hat mir geholfen. Festlegen des Stils 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 Vorlagenspalte mit einer Beschriftung darin verwendet habe, habe ich die Foreground-Eigenschaft mithilfe der RelativeSource-Bindung an den Container Foreground gebunden:

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

Ich habe ControlBrushKey ausprobiert, aber es hat bei nicht ausgewählten Zeilen nicht funktioniert. Der Hintergrund für die nicht ausgewählte Zeile war noch weiß. Aber ich habe es geschafft herauszufinden, 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>
Kenneth Zhang
quelle
2

Ich habe den größten Teil eines Tages damit verbracht, mich mit diesem Problem zu beschäftigen. Es stellte sich heraus, dass die von mir festgelegte RowBackground-Eigenschaft im DataGrid alle Versuche überschrieb, sie zu ändern. Sobald ich es gelöscht habe, hat alles funktioniert. (Gleiches gilt übrigens auch für den in DataGridTextColumn festgelegten Vordergrund).

user947737
quelle