209 votes

Il n'y a pas de ListBox.SelectionMode="None", y a-t-il un autre moyen de désactiver la sélection dans une liste déroulante ?

Comment puis-je désactiver la sélection dans une ListBox?

1 votes

Pouvez-vous fournir un exemple où il est valide d'avoir une ListBox à partir de laquelle vous ne pouvez pas sélectionner ? Puisque le comportement principal est de sélectionner des éléments. Je choisirais probablement un autre moyen de l'afficher. (Ce n'est pas moi qui essaie d'être critique mais plutôt un intérêt sincère pour l'endroit où cela pourrait se produire)

3 votes

@Martin : Par exemple, si vous vouliez faire glisser du contenu à partir d'un élément de liste - dans ce cas, vous n'êtes probablement pas intéressé par la sélection de cet élément. DE PLUS, lorsque vous faites glisser un élément : l'élément sélectionné de la liste change pendant que vous faites glisser dans la liste - voir ce post stackoverflow.com/questions/7589142/…

1 votes

Je crois que la raison pour laquelle Shimmy veut utiliser ListBox est que l'interlocuteur peut rendre la liste sélectionnable parfois. La question est aussi précieuse pour moi. Imaginez que vous construisez un jeu de cartes. Vous pouvez sélectionner une carte parmi vos cartes, parfois, vous pouvez en sélectionner plusieurs et à d'autres moments, vous ne pouvez en sélectionner aucune.

292voto

Drew Noakes Points 69288

Approche 1 - ItemsControl

Sauf si vous avez besoin d'autres aspects du ListBox, vous pourriez utiliser ItemsControl à la place. Il place les éléments dans le ItemsPanel et n'a pas le concept de sélection.

Par défaut, ItemsControl ne prend pas en charge la virtualisation de ses éléments enfants. Si vous avez beaucoup d'éléments, la virtualisation peut réduire l'utilisation de la mémoire et améliorer les performances, auquel cas vous pourriez utiliser l'approche 2 et styliser le ListBox, ou ajouter la virtualisation à votre ItemsControl.

Approche 2 - Styliser ListBox

Alternativement, stylisez simplement le ListBox de telle sorte que la sélection ne soit pas visible.

    <Style.Resources>
      <!-- Élément sélectionné avec le focus -->
      <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
                       Color="Transparent" />
      <!-- Élément sélectionné sans le focus -->
      <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}"
                       Color="Transparent" />
      <!-- Texte de l'élément sélectionné en avant-plan -->
      <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}"
                       Color="Black" />
    </Style.Resources>
    <Setter Property="FocusVisualStyle" Value="{x:Null}" />

27 votes

Non, cela modifiera seulement l'effet visuel, pas le comportement de sélection réel

0 votes

Mon principal désir était le visuel.

10 votes

Ma première suggestion était d'utiliser ItemsControl. L'as-tu ratée? :)

174voto

Asad Durrani Points 631

J'ai trouvé une solution très simple et directe qui fonctionne pour moi, j'espère qu'elle fonctionnera aussi pour vous

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

0 votes

Je pense qu'il l'a plutôt bien expliqué ici : asaddurrani.wordpress.com/tag/wpf-listbox-disable-selection

3 votes

C'est parfait. cela empêche l'élément sélectionné et les autres contrôles tels que les boutons continuent de fonctionner. exactement ce que je cherchais

1 votes

+1 pour cette approche. Si nous avons une page immense sur laquelle nous devons faire défiler, si l'utilisateur survole une ListBox, cela désactive efficacement la Molette de la souris car la listbox prend en charge les événements de la Molette de la souris. Cela signifie que l'utilisateur est frustré que la molette de la souris utilisée pour faire défiler toute la page cesse de fonctionner de manière aléatoire, en fonction du fait que la souris se trouve au-dessus d'une listbox ou non.

31voto

Wilka Points 13239

Vous pourriez passer à l'utilisation d'un ItemsControl au lieu d'un ListBox. Un ItemsControl n'a pas de concept de sélection, donc il n'y a rien à désactiver.

2 votes

Charmant. Je ne savais jamais que vous pouviez directement déclarer ItemsControl, je pensais que c'est virtuel (MustOverride), merci !!!

0 votes

Mais ItemsControl afficherait-il toujours mes éléments sur une seule ligne?

0 votes

@Chry oui, et en plus, vous pouvez toujours définir manuellement le ItemTemplate.

13voto

Caleb Vear Points 1385

Une autre option intéressante à considérer est de désactiver les ListBoxItems. Cela peut être fait en définissant le style ItemContainerStyle comme indiqué dans l'extrait suivant.

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

Si vous ne voulez pas que le texte soit gris, vous pouvez spécifier la couleur désactivée en ajoutant un pinceau aux ressources du style avec la clé suivante : {x:Static SystemColors.GrayTextBrushKey}. L'autre solution serait de remplacer le modèle de contrôle ListBoxItem.

0 votes

Simple et fonctionnel, merci! Et il est également applicable sur WP 8.1 Runtime.

1voto

Peut-être avez-vous seulement besoin de la fonctionnalité de ItemsControl ? Il ne permet pas la sélection :

3 votes

@Shimmy: Il est courant que les réponses triviales se ressemblent. Il n'y a pas de duplication ici digne d'un drapeau. Si vous avez d'autres questions à ce sujet, veuillez les poser sur Meta Stack Overflow.

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