2009-01-26 13 views
8

¿Cómo puedo saber si un Arrastrar Drop ha terminado WinForms .net. Necesito detener una parte de mi formulario para que no actualice su vista de los datos cuando está en progreso una caída de arrastre.¿Cómo puedo saber si un Arrastramiento ha finalizado en Winforms?

He intentado usar una bandera, pero parece que no estoy capturando todos los eventos que necesito para mantener la bandera en sincronía con el progreso de arrastrar y soltar. Específicamente, no puedo decir cuándo finaliza la operación de arrastrar arrastrar sin que se complete una operación de arrastrar, es decir, cuando el usuario suelta el elemento en un control con allow drop = false, o cuando el usuario presiona la tecla ESC.

he visto esta pregunta: -

Check if a drag&drop is in progress

Pero no se ocupa de mi problema de manera satisfactoria (si alguien me da la respuesta a esta pregunta voy a responder que uno con la respuesta junto con lo que ya tengo).

Respuesta

16

No recibí compradores y finalmente me di cuenta de esto.

La respuesta es supervisar el evento QueryContinueDrag. Este evento se dispara continuamente durante la operación de arrastrar y soltar. QueryContinueDragEventArgs contiene una propiedad de acción de tipo enum DragAction, que es DragAction.Cancel, DragAction.Drop o DragAction.Continue. Es una propiedad de lectura/escritura para permitirle cambiar el comportamiento estándar (no lo necesitamos).

Este código de ejemplo supone que el indicador DragDropInProgress se establece al inicio de una operación de arrastrar y se restablece cuando se completa con éxito una extracción de arrastre. Detecta una terminación de DragDrop porque el usuario ha soltado el mouse sin estar sobre un destino de arrastre (los destinos de arrastre son MyControl1 y MyControl2) o cancela la acción de arrastrar. Si no le importa si el DragDropInProgressFlag se restablece antes de que se desencadenen los eventos de DragDrop, puede prescindir de la prueba de aciertos y simplemente reiniciar el indicador.

Private Sub MyControl_QueryContinueDrag(ByVal sender As Object, ByVal e As System.Windows.Forms.QueryContinueDragEventArgs) Handles MyControl.QueryContinueDrag 

    Dim MousePointerLocation As Point = MousePosition 

    If e.Action = DragAction.Cancel Then '' User pressed the Escape button 
     DragDropInProgressFlag = False 
    End If 

    If e.Action = DragAction.Drop Then 
     If Not HitTest(new {MyControl1, MyControl2}, MousePointerLocation) Then 
      DragDropInProgressFlag = False 
     End If 
    End If 

End Sub 

Private Function HitTest(ByVal ctls() As Control, ByVal p As Point) As Boolean 

    HitTest = False 

    For Each ctl In ctls 
     Dim ClientPoint As Point = ctl.PointToClient(p) 
     HitTest = HitTest Or (ClientPoint.X >= 0 AndAlso ClientPoint.Y >= 0 AndAlso ClientPoint.X <= ctl.Width AndAlso ClientPoint.Y <= ctl.Height) 
     If HitTest Then Exit For 
    Next 

End Function 

En este ejemplo HitTest es una rountine que toma una posición Mouse (pantalla de co-ordenadas) y una serie de controles y tamiza a través de la matriz pasando Verdadero si la posición del ratón está en cualquiera de los rectángulos controles.

+0

¡Eres INCREÍBLE! Exactamente lo que necesitaba con una buena implementación para la prueba de impacto en controles específicos. Inteligente. – AMissico

+0

Si clt.ClientRectangle.Contains (ClientPoint) Then: HitTest = True: Exit For: End If – AMissico

+0

: agregado solo para mostrar saltos de línea (aunque la sentencia funcionará como se muestra). – AMissico

Cuestiones relacionadas