Comment puis-je styliser WPF DataGrid pour changer la couleur de la ligne sélectionnée lorsque DataGrid a perdu son focus ?
Réponses
Trop de publicités?Après des siècles de recherche, j'ai trouvé un moyen étonnamment simple de le faire qui est plus propre que l'approche Got/LostFocus publiée plus tôt :
<DataGrid.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="DarkGray"/>
</DataGrid.Resources>
Cela définit simplement la couleur d'arrière-plan inactive sur DarkGray, laissant la couleur d'arrière-plan active par défaut, mais vous pouvez également la modifier à l'aide de SystemColors.HighlightBrushKey bien sûr.
La clé de ressource de premier plan pour les sélections inactives est SystemColors.InactiveSelectionHighlightTextBrushKey.
Solution complète qui fonctionne pour 4.0. Notez que ceci sur le 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>
RÉPONSE TARDIVE:
Cela fonctionne dans .Net 4.0 et vous n'avez pas besoin de coder en dur la couleur :
<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>
Aucune de ces réponses ne m'a donné tout à fait ce que je cherchais. Le mieux noté par Steve Streeting a modifié d'autres sections de la grille de données que je ne voulais pas modifier, et d'autres réponses ne fournissaient pas le changement de couleur inactif , mais ciblaient correctement la ligne uniquement. Voici donc un mélange de leurs réponses qui change la couleur inactive , uniquement sur les lignes et pas à d'autres endroits sur la grille.
<DataGrid.Resources>
<Style TargetType="DataGridRow">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="DarkGray"/>
</Style.Resources>
</Style>
</DataGrid.Resources>