2009-11-12 14 views

Respuesta

19

La respuesta corta es no, porque cuando recibe un evento de arrastre (o arrastre de arrastre, etc.) el objeto de origen de arrastre podría estar en cualquier lugar. Podría ser en otro proceso. Podría ser en código nativo. Incluso podría estar en otra máquina si un protocolo similar a RDP es lo suficientemente sofisticado como para manejarlo. En otras palabras, no hay garantía de que el DoDragDrop gestionado haya sido llamado, y si lo fue no hay garantía de que se haya llamado desde este proceso.

PERO si está escribiendo el código que llama DoDragDrop y también están escribiendo el código para OnDrop(), hay una manera fácil de conseguir este efecto:

En la llamada a DoDragDrop, agregar el objeto como una formato adicional:

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

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

Ahora en el controlador ondrag es fácil de obtener el origen de arrastre:

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

En algunos casos, conocer el objeto de origen en sí mismo es suficiente para obtener los datos que necesita para completar la operación de arrastre, en cuyo caso lo anterior se reduce a:

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

... 

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

Tenga en cuenta que en cualquiera de estos casos, si la fuente de la operación de arrastre es otra que su código (por ejemplo, arrastrando un archivo de Empleador), obtendrá dragSource = null

+9

Dado que la respuesta corta es 'no', ¿cuál es el propósito del parámetro de DragSource para DragDrop. DoDragDrop? ¿Cómo se usa? – HappyNomad