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

Кажется, это не проблема, но я просто не понимаю, как это сделать.

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

Пробовал это (изменил ссылку Neverminds)

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

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

Ответ 1

Получил это. Добавьте в раздел 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>

Ответ 2

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

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

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

Ответ 3

В качестве расширения для ответа @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}").

Ответ 4

У меня была эта проблема, и я чуть не сорвал волосы, и я не смог найти подходящий ответ в сети. Я пытался контролировать цвет фона выбранной строки в WPF DataGrid. Это просто не получится. В моем случае причина заключалась в том, что у меня также был CellStyle в моем datagrid, и 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>

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

Ответ 5

Триггер 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>

Ответ 6

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

  • Стиль настроен для DataGridCell
  • Использование шаблонов с шаблонами
  • Триггер настроен на 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>

Ответ 7

Я пробовал 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>