Il n’y a pas de ListBox.SelectionMode = «None», existe-t-il un autre moyen de désactiver la sélection dans une listbox?

Comment désactiver la sélection dans un ListBox?

Approche 1 – ItemsControl

À moins que vous ayez besoin d’autres aspects du ListBox , vous pouvez utiliser plutôt ItemsControl . Il place des é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. Dans ce cas, vous pouvez utiliser l’approche 2 et personnaliser le ListBox , ou append de la virtualisation à votre ItemsControl .

Approche 2 – Styling ListBox

Sinon, il suffit de styliser le ListBox de manière à ce que la sélection ne soit pas visible.

    

J’ai trouvé une solution très simple et directe qui fonctionne pour moi, j’espère que cela vous conviendra également

      

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

Une autre option à considérer est la désactivation des ListBoxItems. Cela peut être fait en définissant ItemContainerStyle comme indiqué dans l’extrait de code suivant.

      

Si vous ne souhaitez 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 consisterait à remplacer le modèle de contrôle ListBoxItem.

Cela fonctionnera également, si j’ai besoin d’utiliser listbox au lieu de itemscontrol, mais que je n’affiche que les éléments qui ne devraient pas être sélectionnables, j’utilise:

    

Bien que la réponse de @Drew Noakes soit une solution rapide dans la plupart des cas, il y a un petit défaut à régler avec le réglage des brosses x: Static.

Lorsque vous définissez les brosses x: Static comme suggéré, tous les contrôles enfants dans l’élément de la zone de liste hériteront de ce style.

Cela signifie que si cela fonctionne pour désactiver la mise en surbrillance de l’élément de la zone de liste, cela peut entraîner des effets indésirables pour les contrôles enfants.

Par exemple, si vous avez un ComboBox dans votre ListBoxItem, cela désactive le surlignage de la souris dans ComboBox.

Au lieu de cela, envisagez de définir les VisualStates pour les événements Selected, Unselected et MouseOver comme indiqué dans la solution mentionnée dans ce thread stackoverflow: Remove Control Highlight From ListBoxItem mais pas les contrôles enfants .

-Frinny

Assez bonnes réponses ici, mais je cherchais quelque chose de légèrement différent: je veux la sélection, mais je ne veux simplement pas qu’elle soit montrée (ou affichée différemment).

Les solutions ci-dessus n’ont pas fonctionné pour moi (complètement), alors j’ai fait autre chose: j’ai utilisé un nouveau style pour ma listbox, qui redéfinit complètement les modèles:

            

A partir de là, vous pouvez facilement append votre propre sélection en surbrillance, ou la laisser comme ça si vous n’en voulez pas du tout.

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

  

Remarque: cette solution ne désactive pas la sélection par la navigation au clavier ou par un clic droit (c.-à-d. Les touches fléchées suivies d’une touche d’espace)

Toutes les réponses précédentes suppriment la possibilité de sélectionner complètement (pas de changement au moment de l’exécution) ou suppriment simplement l’effet visuel, mais pas la sélection.

Mais que faire si vous voulez pouvoir sélectionner et afficher la sélection par code, mais pas par l’utilisateur? Peut-être voulez-vous “geler” la sélection de l’utilisateur sans désactiver la liste entière?

La solution consiste à envelopper l’ensemble ItemsContentTemplate dans un bouton sans chrome visuel. La taille du bouton doit être égale à la taille de l’article, elle est donc complètement couverte. Utilisez maintenant la propriété IsEnabled-Property du bouton:

Activez le bouton pour “geler” l’état de sélection de l’élément. Cela fonctionne parce que le bouton activé mange tous les événements de la souris avant qu’ils n’atteignent le ListboxItem-Eventhandler. Votre ItemsDataTemplate recevra toujours MouseEvents car il fait partie du contenu des boutons.

Désactivez le bouton pour activer la modification de la sélection en cliquant sur.

     

dartrax

Vous pouvez placer un bloc de texte au-dessus de votre liste, cela ne changera pas l’apparence de votre application et ne permettra pas de sélectionner un élément.

Un correctif simple qui fonctionne sur Windows Phone, par exemple, est sur la sélection de l’élément sélectionné à null:

   

Et dans le code derrière:

  private void ListBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) { (sender as ListBox).SelectedItem = null; } 

Pour moi, la meilleure solution est:

     

J’ai trouvé un moyen parfait.
Définissez ListBox IsHitTestVisible sur false afin que l’utilisateur ne puisse pas survoler la souris ou faire défiler la liste ou faire défiler vers le haut.
Capture PreviewGotKeyboardFocus e.Handled = true pour que l’utilisateur puisse sélectionner un élément par clavier Tab, flèche vers le haut, flèche vers le bas.

De cette façon avantage:

  1. Les éléments ListBox Foreground ne deviendront pas gris.
  2. L’arrière-plan ListBox peut être défini sur Transparent

xmal

                  

code

 private void StudentsListBox_PreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) { e.Handled = true; } 

IsEnabled = false

La réponse d’Hallgeir Engen est une bonne solution, mais le problème est que, après la publication, tous les éléments peuvent être sélectionnés à nouveau. Vous devez donc append dans l’ ensemble de l’atsortingbut ListItem désactivé l’atsortingbut disabled.

Mais la solution est encore plus simple.

Au lieu de désactiver tous les ListItems, vous pouvez simplement désactiver le ListBox lui-même une fois et tous ses éléments de liste sont également désactivés. set Enabled à false, ne désactive pas le ListBox du tout , mais l’ajout de la ligne suivante dans Page_Load fait:

 this.listbox.Atsortingbutes.Add("disabled", "disabled"); 

Après publication, les éléments ne sont plus sélectionnables, vous pouvez donc mettre cette ligne de code dans:

 if (!this.IsPostBack) { } 

Mais tous les éléments sont toujours en gris, donc si vous voulez colorer tous les éléments, faites la classe css:

 .ListItemColor option { color: Black; /*(default color for list item, if it is not disabled)*/ } 

Ensuite, définissez le CssClass du ListBox sur cette classe css ci-dessus. Si vous voulez colorer certains éléments de la liste (mais pas tous), vous devrez styliser certains éléments et donner à chacun sa couleur via le code source (balisage) ou le code (javascript, c # ou Visual Basic).

Pour désactiver une ou plusieurs options de votre liste / liste déroulante, vous pouvez append l’atsortingbut “désactivé” comme indiqué ci-dessous. Cela évite à l’utilisateur de sélectionner cette option, et cela lui donne une superposition de gris.

 ListItem item = new ListItem(yourvalue, yourkey); item.Atsortingbutes.Add("disabled","disabled"); lb1.Items.Add(item);