Чтобы избежать вмешательства в нормальный выбор, обычно пользователь перетаскивает элемент на несколько пикселей, прежде чем выполнять операцию перетаскивания & с помощью 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;
}
}
}
это здорово !! Большое вам спасибо за ваше решение! Идеально!! –