75 votes

Couleur de ligne sélectionnée par DataGrid lorsqu'elle est inactive

Comment puis-je styliser WPF DataGrid pour changer la couleur de la ligne sélectionnée lorsque DataGrid a perdu son focus ?

132voto

Steve Streeting Points 1101

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.

25voto

BigSandwich Points 1372

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>

8voto

Chris Valentine Points 15990

Fais-le comme ça:

 <DataGrid ...>
    <DataGrid.Resources> 
        <Style TargetType="DataGridRow"> 
            <Style.Resources> 
                <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red"/>                                  
            </Style.Resources> 
        </Style> 
   </DataGrid.Resources> 
...

6voto

Eren Ersönmez Points 13491

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>

6voto

DLeh Points 838

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>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X