我已经实现了这个代码来执行列表框中的拖动功能。PreviewMouseLeftButtonDown干扰点击选择
http://www.c-sharpcorner.com/uploadfile/dpatra/drag-and-drop-item-in-listbox-in-wpf/
但意识到事件PreviewMouseLeftButtonDown与CLIC选择干扰。所以当我想选择一个项目时,我必须在项目中进行两次点击。
我应该修改什么来修复该错误?
我已经实现了这个代码来执行列表框中的拖动功能。PreviewMouseLeftButtonDown干扰点击选择
http://www.c-sharpcorner.com/uploadfile/dpatra/drag-and-drop-item-in-listbox-in-wpf/
但意识到事件PreviewMouseLeftButtonDown与CLIC选择干扰。所以当我想选择一个项目时,我必须在项目中进行两次点击。
我应该修改什么来修复该错误?
为避免干扰正常选择,通常在用户通过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;
}
}
}
这是伟大的!非常感谢你的解决方案!这是完美的!! –