Перетащите и выберите элементы ListBox? - PullRequest
3 голосов
/ 08 декабря 2010

как выбрать элементы в списке, если начать перетаскивание от одного элемента до конца перетаскивания?

1 Ответ

5 голосов
/ 08 декабря 2010

Я нашел этот подход в вопросе о 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...