Bagaimana saya bisa mengatur warna baris yang dipilih di DataGrid

127

Warna latar belakang default dari baris yang dipilih di DataGrid sangat gelap sehingga saya tidak bisa membacanya. Apakah ada cara menimpanya?

Sudah mencoba ini

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

Tapi tetap saja tidak ada ...

Jan Bannister
sumber
Ketika Anda mengatakan 'coba ini', maksud Anda, Anda mencobanya dan itu tidak berhasil?
Kolonel Panic
2
Ya itulah artinya @ColonelPanic
co2f2e

Jawaban:

156

Solusi di atas meninggalkan batas biru di sekitar setiap sel dalam kasus saya.

Ini adalah solusi yang berhasil untuk saya. Ini sangat sederhana, cukup tambahkan ini ke DataGrid. Anda bisa mengubahnya dari SolidColorBrushkuas yang lain seperti gradien linier.

<DataGrid.Resources>
  <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
                   Color="#FF0000"/>
</DataGrid.Resources>
Seb Kade
sumber
Sempurna - persis apa yang saya butuhkan. Izinkan saya untuk terus merujuk gaya yang ada untuk DG dan mengubah kuas latar belakang untuk baris yang dipilih.
Gatmando
5
terluka Adakah ide tentang bagaimana melakukan hal yang sama untuk warna foreground?
Arsen Zahray
8
Arsen, cukup timpa kuas untuk SystemColors.HighlightTextBrushKey dengan cara yang sama untuk mengatur warna teks.
Ben McIntosh
Jika saya memilih seluruh baris melalui Databinding, misalkan <DataGrid>ItemsSource="{Binding Path=MySelector}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}"baris tersebut hanya LightGrey. Apakah ada SystemColors? ´
Rolfi
6
Akhirnya menemukan satu jika tidak memiliki Focus: SystemColors.ControlBrushKey.
Rolfi
100

Mengerti. Tambahkan berikut ini di bagian 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
sumber
Ini hebat, saya hanya berlari ke ini dan saya menjadi frustrasi :-)
Rob
6
Bagian apa yang Anda masukkan?
Kolonel Panic
7
Karena BorderBrushtetap berwarna biru, jika itu mengganggu seseorang, tambahkan saja Setterelemen lain , yang menetapkan BorderBrushproperti dependensi ke warna (nilai) yang sama dengan Backgrounddirinya sendiri.
Kai
75

Sebagai jawaban dari jawaban @Seb Kade, Anda dapat sepenuhnya mengontrol warna dari baris yang dipilih dan yang tidak dipilih menggunakan yang berikut 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>

Anda tentu saja dapat memasukkan warna mana yang Anda sukai. Ini Stylejuga akan berfungsi untuk item koleksi lain seperti ListBoxItems (jika Anda ganti TargetType="{x:Type DataGridRow}"dengan TargetType="{x:Type ListBoxItem}"misalnya).

Sheridan
sumber
6
Solusi Anda adalah yang terbaik.
Pengembang
Bagus, Sheridan. Saya juga ingin warna foreground baris saya pada baris yang dipilih. tetapi dibutuhkan HighlightTextBrushKey default (yaitu hitam). apa yang harus dilakukan?
deathrace
1
@ deathrace.dj, Jika saya mengerti Anda dengan benar, maka Anda hanya perlu mengubah Colorproperti yang ketiga SolidColorbrushdalam contoh saya ke warna yang Anda suka. Menggunakan deklarasi ini sebenarnya mengatur warna SolidColorbrushyang SystemColors.HighlightTextBrushKeydigunakan. Berhati-hatilah karena Anda belum mengatur Foregroundwarna di Styletempat lain karena ini dapat mengesampingkan pengaturan di Resourcesatas.
Sheridan
Terima kasih, inilah tepatnya yang saya cari!
Enrico
Anda mungkin juga ingin mengatur kuas transparan SystemColors.InactiveSelectionHighlightBrushKey, atau baris akan menyorot ketika kisi kehilangan fokus
dlf
19

Saya memiliki masalah ini dan saya hampir mencabut rambut saya, dan saya tidak dapat menemukan jawaban yang sesuai di internet. Saya mencoba untuk mengontrol warna latar belakang dari baris yang dipilih dalam WPF DataGrid. Itu tidak akan berhasil. Dalam kasus saya, alasannya adalah karena saya juga memiliki CellStyle di datagrid saya, dan CellStyle mengalahkan RowStyle yang saya setting. Menariknya, karena CellStyle bahkan tidak mengatur warna latar belakang, yang sebaliknya diatur oleh properti RowBackground dan AlternateRowBackground. Namun demikian, mencoba mengatur warna latar belakang dari baris yang dipilih tidak bekerja sama sekali ketika saya melakukan ini:

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

dan itu berhasil ketika saya memindahkan gaya yang diinginkan untuk baris yang dipilih dari gaya baris dan ke gaya sel, seperti:

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

Hanya memposting ini jika seseorang memiliki masalah yang sama.

JS
sumber
Ini terjadi setiap kali, sel menetapkan latar depan dan setiap tubuh menargetkan baris.
eran otzap
1
Saya mengalami ini juga, dan saya bahkan tidak mengatur CellStyle. Ketika saya mencoba mengatur ini pada gaya baris, itu hanya mempengaruhi elemen non-sel.
BigSandwich
12

Pemicu IsSelected default mengubah 3 properti, Background, Foreground & BorderBrush. Jika Anda ingin mengubah batas serta latar belakang, sertakan saja ini di pemicu gaya Anda.

<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>
terima kasih
sumber
@ Markus H, daripada membuat perubahan besar pada jawaban ini di akhir permainan ini, Anda harus menambahkan jawaban Anda sendiri.
Michael Petrotta
9

Beberapa alasan yang saya alami dari deretan acara yang dipilih tidak berfungsi

  1. Gaya diatur untuk DataGridCell
  2. Menggunakan kolom Templated
  3. Pemicu diatur di DataGridRow

Inilah yang membantu saya. Mengatur Style untuk 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>

Dan karena saya menggunakan kolom templat dengan label di dalamnya, saya mengikat properti Foreground ke wadah Foreground menggunakan pengikatan 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
sumber
4

Saya sudah mencoba ControlBrushKey tetapi tidak berhasil untuk baris yang tidak dipilih. Latar belakang untuk baris yang tidak dipilih masih putih. Tapi saya sudah berhasil mengetahui bahwa saya harus mengganti gaya baris.

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

Saya menghabiskan sebagian besar hari dengan mengotak-atik masalah ini. Ternyata properti RowBackground pada DataGrid - yang telah saya tetapkan - mengungguli semua upaya untuk mengubahnya. Segera setelah saya menghapusnya, semuanya bekerja. (Sama berlaku untuk Foreground yang diatur dalam DataGridTextColumn, omong-omong).

pengguna947737
sumber