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

Jan Bannister
źródło
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>
Seb Kade
źródło
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>
Jan Bannister
źródło
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).

Sheridan
źródło
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.

JS
źródło
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>
grantnz
źródło
@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>
Anupam Dutta
źródło
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>
Kenneth Zhang
źródło
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).

user947737
źródło