我已經實現了這個代碼來執行列表框中的拖動功能。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;
}
}
}
這是偉大的!非常感謝你的解決方案!這是完美的!! –