Как установить цвет выделенной строки в DataGrid

127

Цвет фона выбранной строки в DataGrid по умолчанию настолько темный, что я не могу его прочитать. Есть ли способ отменить это?

Пробовал это

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

Но все равно ничего ...

Ян Баннистер
источник
Когда вы говорите "пробовал это", вы имеете в виду, что пробовали это, и это не сработало?
Полковник Паник
2
Да, вот что это значит @ColonelPanic
co2f2e

Ответы:

157

В моем случае вышеупомянутое решение оставило синюю рамку вокруг каждой ячейки.

Это решение, которое сработало для меня. Это очень просто, просто добавьте это в свой DataGrid. Вы можете изменить его с A SolidColorBrushна любую другую кисть, например линейный градиент.

<DataGrid.Resources>
  <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
                   Color="#FF0000"/>
</DataGrid.Resources>
Себ Каде
источник
Идеально - именно то, что мне нужно. Позволил мне продолжить ссылаться на существующий стиль для DG и изменить кисть фона для выбранной строки.
Gatmando 06
5
wounderfull. Есть идеи, как сделать то же самое с цветом переднего плана?
Arsen Zahray
8
Арсен, просто переопределите кисть для SystemColors.HighlightTextBrushKey таким же образом, чтобы установить цвет текста.
Бен МакИнтош
Если я выберу всю строку с помощью привязки данных, например, <DataGrid>ItemsSource="{Binding Path=MySelector}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}"строка будет только LightGrey. Есть еще SystemColors? ´
Рольфи
6
Наконец-то нашел тот, если у него нет Focus : SystemColors.ControlBrushKey.
Рольфи
100

Понял. Добавьте в раздел 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>
Ян Баннистер
источник
Это здорово, я только что столкнулся с этим, и я был разочарован :-)
Роб
6
В какой раздел вы это поместите?
Полковник Паник
7
Так как он BorderBrushостается синим, если это кого-то раздражает, просто добавьте еще один Setterэлемент, который устанавливает для BorderBrushсвойства зависимости тот же цвет (значение), что и Backgroundсам.
kai
75

В дополнение к ответу @Seb Kade вы можете полностью контролировать цвета выбранных и невыделенных строк, используя следующее 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>

Вы, конечно, можете указать любой цвет, который вам больше нравится. Это Styleтакже будет работать и для других элементов коллекции , такие как ListBoxItemс (если заменить TargetType="{x:Type DataGridRow}"с TargetType="{x:Type ListBoxItem}", например).

Шеридан
источник
6
Ваше решение - лучшее.
Разработчик
Хорошо, Шеридан. Мне также нужен цвет переднего плана моей строки в выбранной строке. но по умолчанию используется HighlightTextBrushKey (т.е. черный). что делать?
deathrace
1
@ deathrace.dj, Если я вас правильно понял, то вам просто нужно изменить Colorсвойство третьего SolidColorbrushв моем примере на какой вам нравится цвет. Использование этого объявления фактически устанавливает цвет того, SolidColorbrushчто SystemColors.HighlightTextBrushKeyиспользует. Однако будьте осторожны, чтобы вы не установили Foregroundцвет в другом Styleместе, так как это может переопределить настройки, указанные Resourcesвыше.
Шеридан
Спасибо, это именно то, что я искал!
Энрико
Вы также можете установить прозрачную кисть для SystemColors.InactiveSelectionHighlightBrushKey, иначе строка будет выделяться, когда сетка теряет фокус
dlf
19

У меня была эта проблема, я чуть не вырвал себе волосы, и я не смог найти подходящий ответ в сети. Я пытался контролировать цвет фона выбранной строки в WPF DataGrid. Это просто не сработает. В моем случае причина заключалась в том, что у меня также был CellStyle в моей сетке данных, и CellStyle переопределял RowStyle, который я устанавливал. Это интересно, потому что CellStyle даже не устанавливал цвет фона, который вместо этого был задан свойствами RowBackground и AlternateRowBackground. Тем не менее, попытка установить цвет фона выбранной строки вообще не сработала, когда я сделал это:

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

и это сработало, когда я переместил желаемый стиль для выбранной строки из стиля строки в стиль ячейки, например:

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

Просто разместите это на случай, если у кого-то такая же проблема.

JS
источник
Это происходит каждый раз, когда ячейка устанавливает передний план, и каждое тело нацелено на строку.
eran otzap
1
Я тоже столкнулся с этим, и я даже не устанавливаю CellStyle. Когда я попытался установить это в стиле строки, это повлияло только на элементы, не являющиеся ячейками.
BigSandwich
12

Триггер IsSelected по умолчанию изменяет 3 свойства: Background, Foreground и BorderBrush. Если вы хотите изменить как границу, так и фон, просто включите это в свой триггер стиля.

<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
источник
@Mark H, вместо того, чтобы вносить серьезные изменения в этот ответ в конце игры, вы должны добавить свой собственный ответ.
Майкл Петротта
9

Некоторые из причин, по которым я столкнулся с тем, что событие выбора строки не работает

  1. Настроен стиль для DataGridCell
  2. Использование шаблонных столбцов
  3. Триггер настраивается в DataGridRow

Вот что мне помогло. Установка стиля для 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>

И поскольку я использовал столбец шаблона с меткой внутри, я привязал свойство Foreground к контейнеру Foreground с помощью привязки 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

Я пробовал ControlBrushKey, но для невыделенных строк это не сработало. Фон для невыделенной строки все еще оставался белым. Но мне удалось выяснить, что мне нужно переопределить стиль строки.

<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

Я потратил большую часть дня на решение этой проблемы. Оказалось, что свойство RowBackground в DataGrid, которое я установил, отменяет все попытки изменить его. Как только удалил, все заработало. (Кстати, то же самое касается переднего плана, установленного в DataGridTextColumn).

user947737
источник