1

listBox でドラッグ機能を実行するために、このコードを実装しました。

http://www.c-sharpcorner.com/uploadfile/dpatra/drag-and-drop-item-in-listbox-in-wpf/

しかし、イベント PreviewMouseLeftButtonDown がクリック選択に干渉することに気付きました。そのため、アイテムを選択したいときは、アイテムを 2 回クリックする必要があります。

そのバグを修正するには何を変更すればよいですか?

4

1 に答える 1

4

通常の選択に干渉しないようにするために、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;
        }
    }
}
于 2012-12-31T17:06:55.260 に答える