通常の選択に干渉しないようにするために、DragDrop.DoDragDrop() を介して実際にドラッグ アンド ドロップ操作を実行する前に、ユーザーにアイテムを数ピクセルドラッグさせるのが一般的です (例で通常のクリック選択を中断するのはこの呼び出しです)。
これを行う 1 つの方法は、例を少し拡張し、PreviewMouseLeftButtonDown イベントに加えて、ListBox の PreviewMouseMove および PreviewMouseLeftButtonUp イベントをリッスンして、「潜在的なドラッグ」を追跡することです。
<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;
}
}
}