2009-11-12 80 views

回答

19

簡短的回答是否定的,因爲當你收到一個Drag事件(或DragEnter等)時,拖動源對象可能在任何地方。它可能在另一個過程中。它可以用本地代碼。如果類似RDP的協議足夠複雜以應付它,它甚至可能在另一臺機器上。換句話說,不能保證託管的DoDragDrop甚至被調用,如果它不能保證它從這個過程中被調用。

如果您正在編寫調用DoDragDrop,並且還寫OnDrop()代碼的代碼中,有一個簡單的方法來獲得這種效果:

在調用的DoDragDrop,添加對象作爲額外的格式:

var dragSource = this; 
var data = "Hello"; 

var dataObj = new DataObject(data); 
dataObj.SetData("DragSource", dragSource); 
DragDrop.DoDragDrop(dragSource, dataObj, DragDropEffects.Copy); 

現在在處理ondrag當它是很容易得到拖動源:

protected override void OnDrop(DragEventArgs e) 
{ 
    var data = e.Data.GetData(DataFormats.Text); 
    var dragSource = e.Data.GetData("DragSource"); 
    ... 
} 

在某些情況下,知道源對象本身就足以讓你需要完成拖動操作的數據,在這種情況下,上述歸結爲:

DragDrop.DoDragDrop(dragSource, dragSource, DragDropEffects.Copy); 

... 

var dragSource = e.Data.GetData(typeof(MyDragSource)); 

注意,在這兩種情況下,如果拖動操作的來源不是你的代碼(例如從Emplorer中拖出一個文件),你將得到dragSource = null

+9

由於簡短答案是'否',DragDrop的dragSource參數的目的是什麼。的DoDragDrop?它如何被使用? – HappyNomad 2011-07-22 14:26:09