2012-12-31 31 views

回答

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

這是偉大的!非常感謝你的解決方案!這是完美的!! –