Перетаскивание WPF из ListBox с SelectionMode = Extended - PullRequest
6 голосов
/ 22 сентября 2010

У меня есть ListBox и я хочу, чтобы режим выделения был расширен. Также я хочу реализовать функцию перетаскивания. Теперь проблема в том, что если щелкнуть мышью по выбранному элементу, он будет немедленно выбран как одиночный выбор, вместо того, чтобы ждать этого события.

Из-за этого поведения начало перетаскивания нескольких элементов для пользователя практически невозможно, потому что всегда он щелкает по выделению, чтобы начать перетаскивание, выделение изменяется на элемент, находящийся под мышью, и запускает операцию перетаскивания с этим элементом.

Есть ли хорошее решение этой проблемы или даже существует официальное решение?

Ответы [ 3 ]

8 голосов
/ 05 октября 2010

Вот что я сделал. В своем коде DragDrop подпишитесь на PreviewMouseLeftButtonDown . Если выбран элемент, по которому вы уже щелкаете, установите для e.Handled значение true.

В моем примере ниже я идентифицирую часть элемента списка как ручку для перетаскивания (с выступами), чтобы можно было различать элемент и поверхность перетаскивания. Мне просто нужно было получить шаблон данных элемента списка и поведение перетаскивания, чтобы согласовать имя элемента перетаскивания.

PreviewMouseLeftButtonВниз с моей работы:

private void ItemsControl_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    dragStartPoint = e.GetPosition(null);

    ItemsControl itemsControl = this.AssociatedObject as ItemsControl;
    if (itemsControl != null)
    {
        this.sourceItemContainer = itemsControl.ContainerFromElement((Visual)e.OriginalSource) as FrameworkElement;
    }

    // If this is an multiple or extended selection list box, and on a drag grip, then ensure the item being hit is selected
    // This prevents the ItemsControl from using this MouseDown to change selection, except over a selected item's drag grip.            
    if ((this.IsMultipleSelectionListBox() == true) && (this.IsOriginalSourceDragGrip(e) != false) && (this.IsSourceListBoxItemSelected() == true))
    {
        e.Handled = true;
    }
}
2 голосов
/ 22 сентября 2010

Самый простой обходной путь, который я могу придумать, состоит в том, чтобы изменить ListBoxItem для выбора на MouseUp, а не Down, как это происходит, и изменить ContainerGenerator для обслуживания ваших пользовательских ListBoxItems:

public class CustomListBoxItem : ListBoxItem  
{  
    protected override void OnMouseLeftButtonDown( MouseButtonEventArgs e )  
    {  
        //do nothing
    }  

    protected override void OnMouseLeftButtonUp( MouseButtonEventArgs e )  
    {  
        base.OnMouseLeftButtonDown( e );  
    }  
}  

Вам может потребоваться некоторая логика MouseLeave / LeftButtonDown, если вы хотите запретить выбор различных элементов при перемещении по списку, удерживая кнопку мыши нажатой.

0 голосов
/ 15 ноября 2010

Используйте PreviewMouseLeftButtonDown, чтобы добавить выбранные элементы для операции перетаскивания.

...