2010-12-08 5 views
3

comment sélectionner des éléments dans la zone de liste, si commencez à faire glisser d'un élément à la fin du glissement?Faites glisser et sélectionnez Articles ListBox?

+0

Ce n » t travailler pour vous par défaut? –

+1

Vous voulez dire 'Box Selection' dans' Windows Explorer'? – decyclone

+0

simplement (disons) si je fais glisser de l'élément 5 à 10, je veux marquer ces éléments comme sélectionnés? –

Répondre

5

J'ai trouvé cette approche sur une question sur msdn mais je ne la retrouve plus alors je ne peux pas la lier .. Quoiqu'il en soit, cela marche plutôt bien, seul problème étant de faire glisser et de faire défiler en même temps, il peut manquer quelques éléments. J'ai créé une bibliothèque de contrôle personnalisée appelée MultiSelectLibrary que vous pouvez utiliser comme cette

Ajouter une référence à MultiSelectLibrary qui peut être téléchargé à partir here (source here)
Ajouter l'espace de noms et la MultiSelectListBox avec SelectionMode = « Avancé » et ça devrait marcher.

xmlns:mslb="clr-namespace:MultiSelectLibrary.MultiSelectListBox;assembly=MultiSelectLibrary" 

<mslb:MultiSelectListBox SelectionMode="Extended" .../> 

Si vous plutôt que d'utiliser un code derrière vous pouvez le faire comme ça (faire la même chose que la bibliothèque)

<ListBox SelectionMode="Extended" 
     ...> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ListBoxItem}"> 
      <EventSetter Event="PreviewMouseUp" Handler="ListBoxItem_PreviewMouseUp"/> 
      <EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListBoxItem_PreviewMouseLeftButtonDown"/> 
      <EventSetter Event="PreviewMouseMove" Handler="ListBoxItem_PreviewMouseMove"/> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 

Et dans le code derrière

private object _anchor, _lead; 
private Boolean _inMouseSelectionMode; 
private List<object> _selectedItems = new List<object>(); 

private void ListBoxItem_PreviewMouseUp(object sender, MouseButtonEventArgs e) 
{ 
    _selectedItems.Clear(); 
    _inMouseSelectionMode = false; 
    _anchor = null; 
    _lead = null; 
} 

private void ListBoxItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)) 
     return; 

    _anchor = sender; 
    _inMouseSelectionMode = true; 
    _selectedItems.Clear(); 
    _selectedItems.Add(sender); 
} 
private void ListBoxItem_PreviewMouseMove(object sender, MouseEventArgs e) 
{ 
    if (!_inMouseSelectionMode) 
     return; 

    if (_lead != sender) 
    { 
     var last = _lead; 
     _lead = sender; 

     if (_selectedItems.Contains(_lead)) 
      _selectedItems.Remove(last); 
     else 
      _selectedItems.Add(_lead); 
    } 

    foreach (var item in _selectedItems) 
     ((ListBoxItem)item).IsSelected = true; 
} 
+0

Merci pour le partage, Meleak, va plonger dans le code que je veux quelque chose de semblable. –

+0

Comment puis-je dessiner un cadre sur ce que je sélectionne? – Shimmy

+0

lien vers la source ne fonctionne pas :( –

Questions connexes