Я нашел этот подход в вопросе о msdn, но не могу найти его снова, поэтому не могу связать его .. В любом случае, это работает довольно хорошо, единственная проблема заключается в том, что при перетаскивании и прокрутке одновременноможет пропустить несколько предметов.Я создал библиотеку пользовательских элементов управления MultiSelectLibrary, которую вы можете использовать следующим образом:
Добавить ссылку на MultiSelectLibrary, которую можно загрузить с здесь (Источник здесь )
Добавьте пространство имен и MultiSelectListBox с SelectionMode = "Extended", и оно должно работать.
xmlns:mslb="clr-namespace:MultiSelectLibrary.MultiSelectListBox;assembly=MultiSelectLibrary"
<mslb:MultiSelectListBox SelectionMode="Extended" .../>
Если вы просто используете какой-то код позади, вы можете сделать это следующим образом (сделать то же самое, что и библиотека)
<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>
И в коде позади
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;
}