Начните с установки свойства 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.