Цвет выбранной строки DataGrid в неактивном состоянии
Как я могу стиль WPF DataGrid изменить цвет выбранной строки, когда DataGrid потерял фокус?
10 ответов:
после долгих поисков я нашел удивительно простой способ сделать это, который чище, чем подход Got/LostFocus, опубликованный ранее:
<DataGrid.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="DarkGray"/> </DataGrid.Resources>
это просто устанавливает неактивный цвет фона в темно-серый, оставляя активный цвет фона по умолчанию, но вы можете изменить это тоже с помощью SystemColors.HighlightBrushKey тоже конечно.
ключ ресурса переднего плана для неактивных выборок Системные цвета.InactiveSelectionHighlightTextBrushkey.
комплексное решение, которое работает для 4.0. Обратите внимание, что это на CellStyle.
<DataGrid.CellStyle> <!--Override Highlighting so that its easy to see what is selected even when the control is not focused--> <Style TargetType="{x:Type DataGridCell}"> <Style.Triggers> <Trigger Property="IsSelected" Value="true"> <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" /> <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}" /> <Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" /> </Trigger> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True" /> <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}, Path=IsKeyboardFocusWithin}" Value="False" /> </MultiDataTrigger.Conditions> <MultiDataTrigger.Setters> <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" /> <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}" /> <Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" /> </MultiDataTrigger.Setters> </MultiDataTrigger> </Style.Triggers> </Style> </DataGrid.CellStyle>
делай так:
<DataGrid ...> <DataGrid.Resources> <Style TargetType="DataGridRow"> <Style.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red"/> </Style.Resources> </Style> </DataGrid.Resources> ...
ни один из этих ответов не дал мне то, что я искал. Топ-рейтинг Стива Стритинга изменил другие разделы datagrid, которые я не хотел менять, и другие ответы не предоставляли неактивные изменение цвета, но были правильно нацелены только на строку. Итак, вот смесь их ответов, которая меняет неактивные цвета, только в строках, а не в других местах на сетке.
<DataGrid.Resources> <Style TargetType="DataGridRow"> <Style.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="DarkGray"/> </Style.Resources> </Style> </DataGrid.Resources>
для .Net Framework 4.0 (или если вы не хотите использовать InactiveSelection... клавиши кисти): Создайте DataGridRow шаблон стиля/управления и добавьте эти триггеры:
<ControlTemplate.Triggers> <Trigger Property="IsSelected" Value="true"> <Setter Property="Background" Value="{DynamicResource SelectionBrush}" /> </Trigger> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True" /> <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}, Path=IsKeyboardFocusWithin}" Value="False" /> </MultiDataTrigger.Conditions> <MultiDataTrigger.Setters> <Setter Property="Background" Value="{DynamicResource InactiveSelectionBrush}" /> </MultiDataTrigger.Setters> </MultiDataTrigger> </ControlTemplate.Triggers>
ПОЗДНИЙ ОТВЕТ:
это работает в.Net 4.0, и вам не нужно жестко кодировать цвет:
<Style TargetType="DataGridRow"> <Style.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="{x:Static SystemColors.HighlightColor}" /> <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="{x:Static SystemColors.HighlightTextColor}"/> </Style.Resources> </Style>
найти ответ сам.
добавьте к ресурсам DataGrid кисть, которая может изменить свое свойство "цвет" из кода позади, и ссылайтесь на нее HighlightBrushKey:
<DataGrid.Resources> <SolidColorBrush x:Key="SelectionColorKey" Color="DarkGray"/> <Style TargetType="DataGridRow"> <Style.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="{Binding Source={StaticResource SelectionColorKey}, Path=Color}"/> </Style.Resources> </Style> </DataGrid.Resources>
затем добавьте обработчики событий DataGrids, чтобы вручную изменить цвет:
private void DataGrid1_LostFocus(object sender, RoutedEventArgs e) { ((SolidColorBrush)DataGrid1.Resources["SelectionColorKey"]).Color = Colors.DarkGray; } private void DataGrid1_GotFocus(object sender, RoutedEventArgs e) { ((SolidColorBrush)DataGrid1.Resources["SelectionColorKey"]).Color = SystemColors.HighlightColor; } private void DataGrid1_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) { ((SolidColorBrush)DataGrid1.Resources["SelectionColorKey"]).Color = Colors.DarkGray; }
для .net Framework 4.0
<Style TargetType="DataGridRow"> <Style.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="DarkGray" /> <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="White"/> </Style.Resources> </Style>
вы должны определить раздел " DataGrid.CellStyle " внутри вашего DataGrid вот так:
<DataGrid> <DataGrid.CellStyle> <Style TargetType="DataGridCell"> <Style.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter Property="Background" Value="LightBlue"/> </Trigger> </Style.Triggers> </Style> </DataGrid.CellStyle> </DataGrid>