128 votes

Désactiver la sélection de la ListView WPF

Est-il possible de désactiver la sélection d'un ListView WPF, de sorte que lorsque l'utilisateur clique sur une ligne, la ligne n'est pas mise en surbrillance?

ListView
(source: <a href="https://artax.karlin.mff.cuni.cz/%7Ekonim5am/Vis/wpfGrid.png" rel="nofollow noreferrer">konim5am at artax.karlin.mff.cuni.cz</a>)

J'aimerais que la ligne 1 ressemble juste à la ligne 0 lorsqu'elle est cliquée.

Peut-être lié : puis-je personnaliser l'apparence du survol/sélection? Par exemple, remplacer l'aspect de survol en dégradé bleu (ligne 3) par une couleur unie personnalisée. J'ai trouvé ceci et cela, malheureusement cela n'a pas aidé.

(Atteindre le même résultat sans utiliser ListView est également acceptable. Je voudrais simplement pouvoir utiliser un défilement logique et une virtualisation de l'interface utilisateur comme le fait ListView)

Le XAML pour ListView est :

0 votes

Je n'ai jamais utilisé de ListView dans WPF auparavant, mais je suis sûr qu'il existe une sorte de propriété IsEnabled qui, si elle est définie sur false, désactiverait le contrôle entier et accomplirait probablement ce que vous recherchez, mais je ne suis pas sûr à 100%.

0 votes

Salut, oui il y a une propriété IsEnabled, qui peut désactiver l'ensemble du ListView. J'ai besoin que le ListView fonctionne normalement, juste sans afficher la sélection.

149voto

rmoore Points 9561

Comme l'a commenté Per Martin Konicek, pour désactiver complètement la sélection des éléments de la manière la plus simple :

            <Setter Property="Focusable" Value="false"/>

    ...

Cependant, si vous avez toujours besoin de la fonctionnalité de la ListView, comme la possibilité de sélectionner un élément, alors vous pouvez désactiver visuellement le style de l'élément sélectionné comme ceci :

Vous pouvez le faire de plusieurs façons, en changeant le ControlTemplate de ListViewItem à la définition d'un style (beaucoup plus facile). Vous pouvez créer un style pour les ListViewItem en utilisant ItemContainerStyle et 'désactiver' l'arrière-plan et le pinceau de la bordure lorsqu'il est sélectionné.

            <Style.Triggers>
                <Trigger Property="IsSelected"
                         Value="True">
                    <Setter Property="Background"
                            Value="{x:Null}" />
                    <Setter Property="BorderBrush"
                            Value="{x:Null}" />
                </Trigger>
            </Style.Triggers>

    ...

Aussi, sauf si vous avez un autre moyen de notifier l'utilisateur lorsque l'élément est sélectionné (ou simplement pour tester), vous pouvez ajouter une colonne pour représenter la valeur :

2 votes

N'a pas vu la partie concernée, mais vous pouvez faire la même chose, en définissant l'arrière-plan et la bordure comme vous le souhaitez sur la propriété IsMouseOver.

0 votes

Merci un million de fois, j'aimerais pouvoir vous donner un peu de ma réputation. J'ai également réussi à styliser les lignes pour qu'elles aient des couleurs alternées: live.mscommunity.net/blogs/borissevo/archive/2008/10/21/… Je trouve WPF un peu peu intuitif (je suis débutant), je n'aurais jamais pensé à styliser les ListViewItems comme ItemContainerStyle, pourquoi n'y a-t-il pas de GridView.SelectedRowStyle, GridView.HoverRowStyle? Merci!

90 votes

J'ai résolu le problème encore mieux maintenant - désactive complètement la sélection de la ligne.

31voto

Mark Markindale Points 259

La réponse de Moore ne fonctionne pas, et la page ici:

Spécification de la couleur de sélection, de l'alignement du contenu et de la couleur d'arrière-plan pour les éléments dans une ListBox

explique pourquoi cela ne peut pas fonctionner.

Si votre listview ne contient que du texte de base, le moyen le plus simple de résoudre le problème est d'utiliser des brosses transparentes.

    <Style.Resources>
      <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#00000000"/>
      <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="#00000000"/>
    </Style.Resources>

Cela produira des résultats indésirables si les cellules du listview contiennent des contrôles tels que des combobox, car cela change également leur couleur. Pour résoudre ce problème, vous devez redéfinir le modèle du contrôle.

      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="{x:Type ListViewItem}">
            <Border SnapsToDevicePixels="True" 
                    x:Name="Bd" 
                    Background="{TemplateBinding Background}" 
                    BorderBrush="{TemplateBinding BorderBrush}" 
                    BorderThickness="{TemplateBinding BorderThickness}" 
                    Padding="{TemplateBinding Padding}">
              <GridViewRowPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
                                    VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
                                    Columns="{TemplateBinding GridView.ColumnCollection}" 
                                    Content="{TemplateBinding Content}"/>
            </Border>
            <ControlTemplate.Triggers>
              <Trigger Property="IsEnabled" 
                       Value="False">
                <Setter Property="Foreground" 
                        Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
              </Trigger>
            </ControlTemplate.Triggers>
          </ControlTemplate>
        </Setter.Value>
      </Setter>

14 votes

Cela fait disparaître tous mes éléments de ma ListView

22voto

Hayley Guillou Points 3159

Définissez le style de chaque ListViewItem pour que Focusable soit défini sur false.

            <Setter Property="Focusable" Value="False"/>

4 votes

Simple et efficace. Et cela fait réellement ce qui est demandé : il désactive la sélection au lieu de simplement la cacher. C'est la meilleure réponse.

13voto

Ben Wilde Points 640

Voici le modèle par défaut pour ListViewItem à partir de Blend :

Modèle par défaut de ListViewItem :

Supprimez simplement le déclencheur IsSelected et le MultiTrigger IsSelected/IsSelectionActive en ajoutant le code ci-dessous à votre Style pour remplacer le modèle par défaut, et il n'y aura aucun changement visuel lors de la sélection.

Solution pour désactiver les changements visuels de la propriété IsSelected :

13voto

Martin Konicek Points 7999

La manière la plus simple que j'ai trouvée :

5 votes

@Mutex Ça fonctionne - vous devez appliquer cela sur ListView.ItemContainerStyle cependant !

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