2012-12-31 75 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

这是伟大的!非常感谢你的解决方案!这是完美的!! –