2012-12-31 3 views
0

Я реализовал этот код для выполнения функции перетаскивания в listBox.PreviewMouseLeftButtonDown вмешивается в выбор щелчка

http://www.c-sharpcorner.com/uploadfile/dpatra/drag-and-drop-item-in-listbox-in-wpf/

Но понял, что событие PreviewMouseLeftButtonDown мешает CLIC выбора. Поэтому, когда я хотел бы выбрать элемент, я должен сделать два щелчка в элементе.

Что я должен изменить, чтобы исправить эту ошибку?

ответ

3

Чтобы избежать вмешательства в нормальный выбор, обычно пользователь перетаскивает элемент на несколько пикселей, прежде чем выполнять операцию перетаскивания & с помощью DragDrop.DoDragDrop() (этот вызов прерывает выбор обычного щелчка в ваш пример).

Один из способов сделать это, чтобы расширить свой пример немного, и следить за «потенциального сопротивления», слушая ListBox»PreviewMouseMove и PreviewMouseLeftButtonUp событий, в дополнение к событию PreviewMouseLeftButtonDown:

<ListBox x:Name="lbOne" 
     PreviewMouseLeftButtonDown="ListBox_PreviewMouseLeftButtonDown" 
     PreviewMouseMove="ListBox_PreviewMouseMove" 
     PreviewMouseLeftButtonUp="ListBox_PreviewMouseLeftButtonUp" 
     ... /> 

Обратите внимание, как мы используем potentialDragStartPoint здесь, и как много кода перемещается из ListBox_PreviewMouseLeftButtonDown в ListBox_PreviewMouseMove:

ListBox dragSource = null; 
Point? potentialDragStartPoint = null; 

private void ListBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    if (potentialDragStartPoint == null) 
    { 
     ListBox parent = (ListBox)sender; 
     potentialDragStartPoint = e.GetPosition(parent); 
    } 
} 

private void ListBox_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    potentialDragStartPoint = null; 
} 

private void ListBox_PreviewMouseMove(object sender, MouseEventArgs e) 
{ 
    if (potentialDragStartPoint == null) { return; } 

    ListBox parent = (ListBox)sender; 
    var dragPoint = e.GetPosition(parent); 

    Vector potentialDragLength = dragPoint - potentialDragStartPoint.Value; 
    if (potentialDragLength.Length > 5) 
    { 
     dragSource = parent; 
     object data = GetDataFromListBox(dragSource, potentialDragStartPoint.Value); 

     if (data != null) 
     { 
      DragDrop.DoDragDrop(parent, data, DragDropEffects.Move); 
      potentialDragStartPoint = null; 
     } 
    } 
} 
+0

это здорово !! Большое вам спасибо за ваше решение! Идеально!! –

Смежные вопросы