Jak mogę ustawić kolor wybranego wiersza w DataGrid


127

Domyślny kolor tła wybranego wiersza w DataGrid jest tak ciemny, że nie mogę go odczytać. Czy w ogóle można to zastąpić?

Próbowałem tego

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

Ale nadal nic ...


Kiedy mówisz „próbowałem tego”, masz na myśli to, że próbowałeś tego i nie zadziałało?
Colonel Panic

2
Tak, to właśnie oznacza @ColonelPanic
co2f2e

Odpowiedzi:


156

Powyższe rozwiązanie pozostawiło niebieskie obramowanie wokół każdej komórki w moim przypadku.

To rozwiązanie, które mi się sprawdziło. To bardzo proste, po prostu dodaj to do swojego DataGrid. Możesz go zmienić z a SolidColorBrushna dowolny inny pędzel, taki jak gradient liniowy.

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

Idealnie - dokładnie to, czego potrzebowałem. Pozwolił mi kontynuować odwoływanie się do istniejącego stylu dla DG i zmieniać pędzel tła dla wybranego wiersza.
Gatmando,

5
zraniony. Masz jakiś pomysł, jak zrobić to samo z kolorem pierwszego planu?
Arsen Zahray

8
Arsen, po prostu zastąp pędzel dla SystemColors.HighlightTextBrushKey w ten sam sposób, aby ustawić kolor tekstu.
Ben McIntosh,

Jeśli zaznaczę cały wiersz za pomocą powiązania danych, np <DataGrid>ItemsSource="{Binding Path=MySelector}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}". Wiersz jest tylko jasnoszary. Czy istnieje również SystemColors? ´
Rolfi

6
W końcu okazało się, że jeden, jeśli nie ma ostrości: SystemColors.ControlBrushKey.
Rolfi

100

Rozumiem. Dodaj następujące elementy w sekcji 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>

To jest świetne, właśnie wpadłem na to i byłem sfrustrowany :-)
Rob

6
W której sekcji to umieścisz?
Colonel Panic

7
Ponieważ BorderBrushpozostaje niebieski, jeśli kogoś denerwuje, po prostu dodaj kolejny Setterelement, który ustawi BorderBrushwłaściwość zależności na ten sam kolor (wartość) co ona Backgroundsama.
kai

75

Jako rozszerzenie odpowiedzi @Seb Kade, możesz w pełni kontrolować kolory zaznaczonych i niezaznaczonych wierszy za pomocą 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>

Możesz oczywiście wprowadzić dowolne kolory. To Stylebędzie również działać na innych przedmiotów, takich jak zbiórki ListBoxItems (jeśli zastąpi TargetType="{x:Type DataGridRow}"się TargetType="{x:Type ListBoxItem}"na przykład).


6
Twoje rozwiązanie jest najlepsze.
Deweloper

Niezłe, Sheridan. Chcę też mieć kolor pierwszego planu w wybranym wierszu. ale przyjmuje domyślny HighlightTextBrushKey (tj. czarny). co robić?
wyścig śmierci

1
@ deathrace.dj, Jeśli dobrze Cię rozumiem, wystarczy zmienić Colorwłaściwość trzeciego SolidColorbrushw moim przykładzie na dowolny kolor. Korzystanie z tej deklaracji jest rzeczywiście ustawienie koloru SolidColorbrush, że w SystemColors.HighlightTextBrushKeyzastosowaniach. Uważaj jednak, aby nie ustawić Foregroundkoloru w innym Stylemiejscu, ponieważ może to zastąpić ustawienia Resourcesopisane powyżej.
Sheridan,

Dzięki, właśnie tego szukałem!
Enrico

Możesz także ustawić przezroczysty pędzel SystemColors.InactiveSelectionHighlightBrushKeylub wiersz zostanie podświetlony, gdy siatka straci ostrość
dlf

19

Miałem ten problem i prawie wyrwałem sobie włosy, a nie mogłem znaleźć odpowiedniej odpowiedzi w sieci. Próbowałem kontrolować kolor tła wybranego wiersza w WPF DataGrid. Po prostu by tego nie zrobił. W moim przypadku powodem było to, że miałem również CellStyle w moim datagridzie, a CellStyle zastąpił ustawienie RowStyle. Co ciekawe, ponieważ CellStyle nie ustawiał nawet koloru tła, który zamiast tego był ustawiany przez właściwości RowBackground i AlternateRowBackground. Niemniej jednak próba ustawienia koloru tła wybranego wiersza w ogóle nie działała, gdy zrobiłem to:

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

i zadziałało, gdy przeniosłem żądany styl dla wybranego wiersza ze stylu wiersza do stylu komórki, na przykład:

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

Po prostu opublikuj to na wypadek, gdyby ktoś miał ten sam problem.


Dzieje się tak za każdym razem, gdy komórka ustawia pierwszy plan, a każde ciało jest skierowane na wiersz.
eran otzap

1
Ja też na to wpadłem i nawet nie ustawiam CellStyle. Kiedy próbowałem ustawić to w stylu wiersza, wpłynęło to tylko na elementy niebędące komórkami.
BigSandwich,

12

Domyślny wyzwalacz IsSelected zmienia 3 właściwości, Background, Foreground i BorderBrush. Jeśli chcesz zmienić obramowanie, a także tło, po prostu uwzględnij to w wyzwalaczu stylu.

<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, zamiast dokonywać poważnych zmian w tej odpowiedzi pod koniec gry, powinieneś dodać własną odpowiedź.
Michael Petrotta

9

Niektóre z powodów, dla których zauważyłem, że wiersz wybrany zdarzenie nie działa

  1. Styl jest skonfigurowany dla DataGridCell
  2. Korzystanie z kolumn opartych na szablonach
  3. Wyzwalacz jest konfigurowany w DataGridRow

To mi pomogło. Ustawianie stylu dla 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>

A ponieważ używałem kolumny szablonu z etykietą w środku, związałem właściwość Foreground z kontenerem Foreground za pomocą powiązania 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

Próbowałem ControlBrushKey, ale nie działało to dla niezaznaczonych wierszy. Tło niewybranego wiersza było nadal białe. Ale udało mi się dowiedzieć, że muszę zmienić styl wiosłowania.

<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

Większą część dnia spędziłem na majstrowaniu przy tym problemie. Okazało się, że właściwość RowBackground w DataGrid - którą ustawiłem - przesłaniała wszystkie próby jej zmiany. Jak tylko go usunąłem, wszystko działało. (Nawiasem mówiąc, to samo dotyczy zestawu Foreground w DataGridTextColumn).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.