[英]How to drag & drop items in the same ListView?
考慮到這是一個顯示文件和文件夾的ListView,我已經編寫了復制/移動/重命名/顯示屬性... etc的代碼,我只需要再做一件事。 如何像在Windows資源管理器中一樣在相同的ListView中拖放,我具有移動和復制功能,我只需要獲取用戶放置在某個文件夾中的項目,或者以其他方式需要獲取這兩個參數來調用復制功能
void copy(ListViewItem [] droppedItems, string destination path)
{
// Copy target to destination
}
首先將列表視圖的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屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.