Как я могу установить цвет выбранной строки в DataGrid - PullRequest
118 голосов
/ 03 августа 2009

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

Цвет фона по умолчанию для выбранной строки в 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>

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

Ответы [ 8 ]

145 голосов
/ 06 августа 2010

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

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

<DataGrid.Resources>
  <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
                   Color="#FF0000"/>
</DataGrid.Resources>
92 голосов
/ 04 августа 2009

Понял. Добавьте следующее в раздел 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>
70 голосов
/ 09 марта 2012

В качестве дополнения к ответу @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 s (например, если заменить TargetType="{x:Type DataGridRow}" на TargetType="{x:Type ListBoxItem}").

17 голосов
/ 09 августа 2013

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

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

12 голосов
/ 11 октября 2010

Триггер по умолчанию 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>
9 голосов
/ 19 июня 2015

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

  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>
5 голосов
/ 27 апреля 2015

Я пробовал 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 голосов
/ 14 июля 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...