web-dev-qa-db-fra.com

wpf: DataGrid désactiver les styles de ligne sélectionnés - ou la sélection de ligne

Je vois beaucoup d'exemples sur la façon de styliser les lignes sélectionnées dans DataGrid comme celui-ci:

Comment puis-je définir la couleur d'une ligne sélectionnée dans DataGrid

Puis-je simplement désactiver le style de ligne sélectionné? je ne veux pas avoir à remplacer chaque chose que la ligne sélectionnée change. Je ne veux tout simplement pas de changements visibles. Ça doit être un moyen plus simple que de créer des modèles.

ou..

désactiver la sélection des lignes, si c'est plus facile .. mais en parcourant ce forum qui semble aussi hacky

Désactiver la sélection dans WPF DataGrid

41
Sonic Soul

compris le XAML pour se débarrasser du style de sélection .. pas idéal, mais assez proche ..

<Style x:Key="CellStyle" TargetType="{x:Type DataGridCell}">
    <Setter Property="Foreground" Value="Black" />
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Background" Value="{x:Null}" />
            <Setter Property="BorderBrush" Value="{x:Null}" />
        </Trigger>
    </Style.Triggers>
</Style>
72
Sonic Soul

Voici ce qui a fonctionné pour moi:

<DataGrid>
    <DataGrid.CellStyle>
        <Style TargetType="{x:Type DataGridCell}">
            <Style.Triggers>
                <Trigger Property="DataGridCell.IsSelected" Value="True">
                    <Setter Property="BorderBrush">
                        <Setter.Value>
                            <SolidColorBrush Color="Transparent"/>
                        </Setter.Value>
                    </Setter>
                    <Setter Property="Foreground"
                            Value="{DynamicResource
                                   {x:Static SystemColors.ControlTextBrushKey}}"/>
                    <Setter Property="Background">
                        <Setter.Value>
                            <SolidColorBrush Color="Transparent"/>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </DataGrid.CellStyle>
    <!-- ... -->
</DataGrid>
21
Dan Stevens

J'ai trouvé un autre moyen qui fonctionne bien pour ma situation. J'ai défini ce style pour toutes les cellules car je ne veux pas que l'utilisateur sélectionne des cellules.

<Style TargetType="{x:Type DataGridCell}">
    <Setter Property="IsHitTestVisible" Value="False"/>
</Style>
17
Brian Ensink

Je vais d'abord répondre à la deuxième question: pour désactiver la sélection des lignes, vous pouvez modifier le RowStyle de votre DataGrid.

<DataGrid>
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="IsEnabled" Value="False"/>
        </Style>
    </DataGrid.RowStyle>
    <!--Other DataGrid items-->
</DataGrid>

Cependant, cela modifie le style de texte car la ligne elle-même est désormais "désactivée". Cela ne nie pas non plus le fait qu'un utilisateur peut toujours cliquer avec le bouton droit sur la ligne pour la sélectionner. Si vous vouliez vraiment désactiver tout type d'interaction avec les lignes de la grille de données, vous pouvez procéder comme suit:

<DataGrid>
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="IsHitTestVisible" Value="False"/>
        </Style>
    </DataGrid.RowStyle>
    <!--Other DataGrid items-->
</DataGrid>

Comme les lignes sont toujours activées, le style du texte ne change pas.

Maintenant, si vous vouliez uniquement changer le style de la ligne sélectionnée mais laisser la fonctionnalité seule, vous pouvez faire ce qui suit (qui est fondamentalement le même que @Dan Réponse de Stevens). ControlTextBrushKey est le pinceau utilisé par le système pour colorer les éléments de texte. Veuillez consulter cette réponse pour une explication entre DynamicResource et StaticResource.

<DataGrid>
    <DataGrid.CellStyle>
        <Style TargetType="{x:Type DataGridCell}">
            <Style.Triggers>
                <Trigger Property="DataGridCell.IsSelected" Value="True">
                    <Setter Property="BorderBrush" Value="Transparent"/>
                    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
                    <Setter Property="Background" Value="Transparent"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </DataGrid.CellStyle>
    <!--Other DataGrid items-->
</DataGrid>

Il est important de noter que la solution ci-dessus ne change pas le style de DataGridRowHeader lorsque la ligne est sélectionnée, comme on peut le voir ci-dessous (la première ligne est sélectionnée).

enter image description here

8
Joshua

C'est relativement simple:

datagrid.SelectionChanged += (obj, e) =>
  Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() =>
    datagrid.UnselectAll()));

Cela désactive toute sélection sur le DataGrid.

Si vous ne voulez pas désactiver complètement la sélection mais la cachez, vous devrez modifier le modèle.

6
Ray Burns

Pour ceux comme moi qui ont des cellules avec des styles différents et qui ne veulent pas remplacer tous les styles ni ajouter de déclencheurs à chaque style, c'est un bon pari:

<DataGrid.Resources>
    <SolidColorBrush 
        x:Key="{x:Static SystemColors.HighlightBrushKey}" 
        Color="#333333"/>
    <SolidColorBrush 
        x:Key="{x:Static SystemColors.HighlightTextBrushKey}" 
        Color="Black"/>
    <SolidColorBrush 
        x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" 
        Color="Black"/>
    <SolidColorBrush 
        x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" 
        Color="Black"/>
</DataGrid.Resources>

HighlightBrushKey est la bordure en surbrillance avec la sélection active et HighlightTextBrushKey est la couleur du texte avec la sélection active

Dans mon cas, je souhaite que la sélection inactive ne soit pas sélectionnée:

InactiveSelectionHighlightBrushKey est la bordure lorsque la sélection est inactive et InactiveSelectionHighlightTextBrushKey est le texte lorsque la sélection est inactive

FYI: SystemColors est une classe statique, une partie de l'espace de noms System.Windows.Media. Vous pouvez l'inspecter et écraser sans vergogne n'importe quelle couleur que vous n'aimez pas!

1
Benoit Dufresne