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.

9voto

D'accord, un peu tard pour le jeu, mais aucune de ces solutions ne fait exactement ce que j'essayais de faire. Ces solutions ont quelques problèmes

  1. Désactiver ListViewItem, ce qui perturbe les styles et désactive tous les contrôles enfants
  2. Retirer de la pile de test de collision, c'est-à-dire que les contrôles enfants ne reçoivent jamais de survol de souris ou de clic
  3. Rendre non focusable, cela n'a tout simplement pas fonctionné pour moi?

Je voulais un ListView avec les en-têtes de regroupement, et chaque ListViewItem devrait simplement être 'informatif' sans sélection ni survol, mais le ListViewItem a un bouton en lui que je veux pouvoir cliquer et survoler.

Donc, ce que je veux vraiment, c'est que le ListViewItem ne soit pas du tout un ListViewItem, donc j'ai modifié le ControlTemplate du ListViewItem et en ai fait simplement un ContentControl.

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <ContentControl Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}"/>
                </ControlTemplate>
            </Setter.Value>
         </Setter>

8voto

Reddog Points 7462

En réponse à la solution ci-dessus... Je utiliserais un MultiTrigger pour permettre aux surbrillances de MouseOver de continuer à fonctionner après la sélection de manière à ce que le style de votre ListViewItem soit :

                <Style.Triggers>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsSelected" Value="True" />
                            <Condition Property="IsMouseOver" Value="False" />
                        </MultiTrigger.Conditions>
                        <MultiTrigger.Setters>
                            <Setter Property="Background" Value="{x:Null}" />
                            <Setter Property="BorderBrush" Value="{x:Null}" />
                        </MultiTrigger.Setters>
                    </MultiTrigger>
                </Style.Triggers>

7voto

Jacob Levertov Points 95

Une des propriétés de la liste est IsHitTestVisible. Décochez-la.

0 votes

Simple et efficace, a également résolu mon problème avec ScrollViewer enveloppé à l'extérieur d'une liste de visualisation.

4 votes

J'ai un modèle de bouton à l'intérieur du modèle d'élément de listview. Si je désélectionne IsHitTestVisible, le bouton ne peut pas être cliqué. Il se comporte comme IsEnabled = false;

5voto

Jorge Freitas Points 367

Utilisez le code ci-dessous :

        <Setter Property="Background" Value="Transparent" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListViewItem}">
                    <ContentPresenter />
                </ControlTemplate>
            </Setter.Value>
        </Setter>

2voto

BCA Points 369

Ceci est pour les autres qui pourraient rencontrer les exigences suivantes :

  1. Remplacez complètement l'indication visuelle "sélectionnée" (par exemple, utilisez une sorte de forme), au-delà de simplement changer la couleur de la mise en évidence standard
  2. Incluez cette indication de sélection dans le DataTemplate avec les autres représentations visuelles de votre modèle, mais,
  3. Vous ne voulez pas avoir à ajouter une propriété "IsSelectedItem" à votre classe de modèle et être chargé de manipuler manuellement cette propriété sur tous les objets de modèle.
  4. Exigez que les éléments soient sélectionnables dans la ListView
  5. Aimeriez également remplacer la représentation visuelle de IsMouseOver

Si vous êtes comme moi (utilisant WPF avec .NET 4.5) et que vous avez constaté que les solutions impliquant des déclencheurs de style ne fonctionnaient tout simplement pas, voici ma solution :

Remplacez le ControlTemplate du ListViewItem dans un style :

                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListViewItem">
                            <ContentPresenter/>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>

..Et le DataTemplate :

Résulte en ceci à l'exécution (l'élément 'B' est sélectionné, l'élément 'D' a le survol de la souris) :

Apparence de la ListView

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