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.