Как перетащить элементы в один и тот же ListView? - PullRequest
2 голосов
/ 25 февраля 2012

enter image description here

Считайте, что это ListView, который показывает файлы и папки, я уже написал код для свойств копирования / перемещения / переименования / отображения ... и т. Д., И мне просто нужна еще одна вещь. как перетаскивать в том же ListView, как в Windows Explorer, у меня есть функции перемещения и копирования, и мне просто нужно получить элементы, которые пользователь помещает в какую-то папку, или другим способом мне нужно, чтобы эти два параметра вызвали копия функция

void copy(ListViewItem [] droppedItems, string destination path)
{
 // Copy target to destination
}

1 Ответ

4 голосов
/ 25 февраля 2012

Начните с установки свойства AllowDrop представления списка в значение true.Реализация события ItemDrag для определения начала перетаскивания.Я буду использовать личную переменную, чтобы гарантировать, что D + D работает только внутри элемента управления:

    bool privateDrag;

    private void listView1_ItemDrag(object sender, ItemDragEventArgs e) {
        privateDrag = true;
        DoDragDrop(e.Item, DragDropEffects.Copy);
        privateDrag = false;
    }

Далее вам понадобится событие DragEnter, оно будет немедленно запущено:

    private void listView1_DragEnter(object sender, DragEventArgs e) {
        if (privateDrag) e.Effect = e.AllowedEffect;
    }

Далее вы захотите быть избирательными в отношении того, на какой элемент пользователь может уронить.Для этого требуется событие DragOver и проверка, какой элемент находится в процессе перемещения.Вам нужно будет отличать элементы, представляющие папку, от обычных «файловых» элементов.Один из способов сделать это - использовать свойство ListViewItem.Tag.Например, вы можете указать путь к папке.Чтобы этот код работал:

    private void listView1_DragOver(object sender, DragEventArgs e) {
        var pos = listView1.PointToClient(new Point(e.X, e.Y));
        var hit = listView1.HitTest(pos);
        if (hit.Item != null && hit.Item.Tag != null) {
            var dragItem = (ListViewItem)e.Data.GetData(typeof(ListViewItem));
            copy(dragItem, (string)hit.Item.Tag);
        }
    }

Если вы хотите поддерживать перетаскивание нескольких элементов, сделайте свой объект перетаскивания свойством ListView.SelectedIndices.

...