WPF ListView désactive la sélection

J’ai un simple WPF ListView et une question simple:

Est-il possible de désactiver la sélection, alors lorsque l’utilisateur clique sur la ligne, la ligne n’est pas mise en surbrillance?

ListView

Je voudrais que la ligne 1 ressemble à la ligne 0 quand on clique dessus.

Peut-être lié: puis-je styliser l’apparence du survol / sélection? Par exemple. pour remplacer le dégradé de bleu (ligne 3) par une couleur unie personnalisée. J’ai trouvé ceci et cela , malheureusement pas aider.

(Obtenir la même chose sans utiliser ListView est également acceptable. Je voudrais juste pouvoir utiliser le défilement logique et la virtualisation d’interface utilisateur comme le fait ListView)

Le XAML pour ListView est:

              

Selon le commentaire de Martin Konicek, pour désactiver complètement la sélection des éléments de la manière la plus simple:

     ...  

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

Vous pouvez le faire de plusieurs manières, en changeant le ControlTemplate de ListViewItem pour simplement définir un style (beaucoup plus facile). Vous pouvez créer un style pour les ListViewItems à l’aide de ItemContainerStyle et “désactiver” l’arrière-plan et le pinceau de bordure lorsqu’il est sélectionné.

     ...  

En outre, à moins d’avoir une autre manière de notifier l’utilisateur lorsque l’élément est sélectionné (ou juste pour le tester), vous pouvez append une colonne pour représenter la valeur:

  

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 d’un contrôle ListBox

explique pourquoi il 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 consiste à utiliser des pinceaux transparents.

    

Cela produira des résultats indésirables si les cellules de la liste de contrôle contiennent des commandes telles que les listes déroulantes, car elles changent également de couleur. Pour résoudre ce problème, vous devez redéfinir le modèle du contrôle.

     

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

      

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

Modèle ListViewItem par défaut:

                            

Supprimez simplement le déclencheur IsSelected et IsSelected / IsSelectionActive MultiTrigger, 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 modifications visuelles de la propriété IsSelected:

                

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

  

Suite à la solution ci-dessus … J’utiliserais un MultiTrigger pour permettre aux points culminants de MouseOver de continuer à fonctionner après la sélection de sorte que le style de votre ListViewItem soit:

     

IsHitTestVisible est l’une des propriétés de la vue de liste. Décochez-la.

D’accord, un peu tard pour le jeu, mais aucune de ces solutions n’a vraiment fait ce que j’essayais de faire. Ces solutions ont quelques problèmes

  1. Désactiver le ListViewItem, qui visser les styles et désactive tous les contrôles enfants
  2. Supprimer de la stack de hit-test, c.-à-d.
  3. Ne le rend pas focalisable, tout simplement ne fonctionnait pas pour moi?

Je voulais un ListView avec les en-têtes de regroupement, et chaque ListViewItem devrait juste être “informatif” sans sélection ou survoler, mais le ListViewItem a un bouton dans lequel je veux pouvoir faire un clic et survoler.

Donc, ce que je veux vraiment, c’est que ListViewItem ne soit pas du tout un ListViewItem, donc, je suis allé plus loin que le ControlTemplate de ListViewItem et en ai fait un simple ContentControl.

    

Utilisez le code ci-dessous:

     

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

  1. Remplacez complètement l’indication visuelle de “sélectionné” (par exemple, utilisez une forme quelconque), au-delà de la simple modification de la couleur de la surbrillance standard
  2. Inclure cette indication sélectionnée dans le DataTemplate avec les autres représentations visuelles de votre modèle, mais
  3. Vous ne devez pas avoir à append une propriété “IsSelectedItem” à votre classe de modèle et avoir à manipuler manuellement cette propriété sur tous les objects du modèle.
  4. Exiger que les éléments puissent être sélectionnés dans ListView
  5. J’aimerais également remplacer la représentation visuelle de IsMouseOver

Si vous êtes comme moi (en 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 par un style:

      

..Et le DataTemplate:

          

Résultats à l’exécution (item ‘B’ sélectionné, item ‘D’ a survolé):

Apparence de ListView