it-swarm.com.ru

Как установить цвет выбранной строки в 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>

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

118
Jan Bannister

Понял. Добавьте следующее в раздел 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>
92
Jan Bannister

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

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

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

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

69
Sheridan

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

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

17
J S

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

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

  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>
9
Anupam Dutta

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

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

2
user947737