Làm cách nào tôi có thể đặt màu của một hàng đã chọn trong DataGrid


127

Màu nền mặc định của một hàng được chọn trong DataGrid tối đến mức tôi không thể đọc được. Có cách nào vượt qua nó?

Đã thử cái này

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

Nhưng vẫn không có gì ...


Khi bạn nói 'đã thử điều này', bạn có nghĩa là bạn đã thử nó và nó không hoạt động?
Đại tá Panic

2
Vâng, đó là ý nghĩa của nó @ColonelPanic
co2f2e

Câu trả lời:


155

Các giải pháp trên để lại đường viền màu xanh xung quanh mỗi ô trong trường hợp của tôi.

Đây là giải pháp hiệu quả với tôi. Nó rất đơn giản, chỉ cần thêm điều này vào của bạn DataGrid. Bạn có thể thay đổi nó từ một SolidColorBrushsang bất kỳ cọ khác như gradient tuyến tính.

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

Hoàn hảo - chính xác những gì tôi cần. Cho phép tôi tiếp tục tham chiếu một kiểu hiện có cho DG và thay đổi cọ nền cho một hàng đã chọn.
Gatmando

5
đầy thương tích. Bất kỳ ý tưởng về cách làm tương tự để màu nền trước?
Asen Zahray

8
Asen, chỉ cần ghi đè bàn chải cho SystemColors.HighlightTextBrushKey theo cùng một cách để đặt màu văn bản.
Ben McIntosh

Nếu tôi chọn toàn bộ hàng thông qua Databinding, ví dụ <DataGrid>ItemsSource="{Binding Path=MySelector}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}"hàng đó chỉ là LightGrey. Có còn có SystemColors không? '
Rolfi

6
Cuối cùng cũng tìm thấy cái nếu nó không có Focus : SystemColors.ControlBrushKey.
Rolfi

100

Hiểu rồi. Thêm phần sau vào phần DataGrid.Resource:

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

Điều này thật tuyệt, tôi vừa gặp phải điều này và tôi đã trở nên thất vọng :-)
Rob

6
Phần nào bạn đặt nó vào?
Đại tá hoảng loạn

7
BorderBrushmàu xanh vẫn còn, nếu nó làm phiền ai đó, chỉ cần thêm một Setteryếu tố khác , đặt BorderBrushthuộc tính phụ thuộc thành cùng màu (giá trị) như Backgroundchính nó.
kai

75

Như một phần mở rộng cho câu trả lời của @Seb Kade, bạn hoàn toàn có thể kiểm soát màu sắc của các hàng được chọn và không được chọn bằng cách sử dụng như sau 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>

Tất nhiên bạn có thể nhập bất kỳ màu nào bạn thích. Điều này Stylecũng sẽ làm việc cho các mục bộ sưu tập khác, chẳng hạn như ListBoxItems (nếu bạn thay thế TargetType="{x:Type DataGridRow}"bằng TargetType="{x:Type ListBoxItem}"ví dụ).


6
Giải pháp của bạn là tốt nhất.
Nhà phát triển

Hay đấy, Sheridan. Tôi cũng muốn màu nền trước của hàng của tôi trên hàng được chọn. nhưng nó mặc định HighlightTextBrushKey (tức là màu đen). phải làm sao
deathrace

1
@ deathrace.dj, Nếu tôi hiểu bạn một cách chính xác, thì bạn chỉ cần thay đổi thuộc Colortính của phần ba SolidColorbrushtrong ví dụ của tôi thành màu nào bạn thích. Sử dụng khai báo này thực sự là thiết lập màu sắc của SolidColorbrushviệc SystemColors.HighlightTextBrushKeysử dụng. Hãy cẩn thận mặc dù bạn chưa đặt Foregroundmàu ở Stylenơi khác vì điều này có thể ghi đè lên các cài đặt ở Resourcestrên.
Sheridan

Cảm ơn, đây chính xác là những gì tôi đang tìm kiếm!
Enrico

Bạn cũng có thể muốn đặt một bàn chải trong suốt SystemColors.InactiveSelectionHighlightBrushKeyhoặc hàng sẽ nổi bật khi lưới mất tiêu điểm
dlf

19

Tôi gặp vấn đề này và tôi suýt xé tóc ra, và tôi không thể tìm được câu trả lời thích hợp trên mạng. Tôi đã cố gắng kiểm soát màu nền của hàng đã chọn trong WPF DataGrid. Nó sẽ không làm điều đó. Trong trường hợp của tôi, lý do là tôi cũng có một CellStyle trong datagrid của mình và CellStyle đã vượt qua RowStyle mà tôi đang thiết lập. Điều thú vị là, bởi vì CellStyle thậm chí còn không đặt màu nền, mà thay vào đó là bing được đặt bởi các thuộc tính RowBackground và AlternateRowBackground. Tuy nhiên, cố gắng đặt màu nền của hàng đã chọn hoàn toàn không hoạt động khi tôi thực hiện việc này:

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

và nó đã hoạt động khi tôi chuyển kiểu mong muốn cho hàng đã chọn ra khỏi kiểu hàng và sang kiểu ô, như vậy:

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

Chỉ cần đăng bài này trong trường hợp ai đó có cùng một vấn đề.


Điều này xảy ra mỗi lần, ô đặt tiền cảnh và mọi cơ thể nhắm vào hàng.
eran otzap

1
Tôi cũng gặp phải vấn đề này và thậm chí tôi còn không cài đặt CellStyle. Khi tôi cố gắng đặt kiểu này trên kiểu hàng, nó chỉ ảnh hưởng đến các thành phần không phải ô.
BigSandwich

12

Trình kích hoạt IsSelected mặc định thay đổi 3 thuộc tính, Bối cảnh, Tiền cảnh & BorderBrush. Nếu bạn muốn thay đổi đường viền cũng như nền, chỉ cần đưa phần này vào trình kích hoạt kiểu của bạn.

<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, thay vì thực hiện những thay đổi lớn cho câu trả lời này vào cuối trò chơi, bạn nên thêm câu trả lời của riêng mình.
Michael Petrotta

9

Một số lý do khiến tôi trải nghiệm hàng đã chọn sự kiện không hoạt động

  1. Kiểu được thiết lập cho DataGridCell
  2. Sử dụng cột Templated
  3. Kích hoạt được thiết lập tại DataGridRow

Đây là những gì đã giúp tôi. Đặt kiểu cho 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>

Và vì tôi đang sử dụng một cột mẫu có nhãn bên trong, tôi đã ràng buộc thuộc tính Tiền cảnh vào vùng chứa Tiền cảnh bằng cách sử dụng liên kết 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

Tôi đã thử ControlBrushKey nhưng nó không hoạt động đối với các hàng không được chọn. Nền cho hàng không được chọn vẫn là màu trắng. Nhưng tôi đã phát hiện ra rằng tôi phải ghi đè kiểu hàng.

<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

Tôi đã dành phần tốt hơn của một ngày loay hoay với vấn đề này. Hóa ra Thuộc tính RowBackground trên DataGrid - mà tôi đã đặt - đã ghi đè tất cả các nỗ lực để thay đổi nó. Ngay khi tôi xóa nó, mọi thứ đã hoạt động. (Nhân tiện, cũng vậy đối với Tiền cảnh được đặt trong DataGridTextColumn).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.