如何判断Drag Drop是否已在Winforms中结束?

时间:2009-01-26 15:27:36

标签: .net winforms

我怎么知道Drag Drop已经结束了WinForms .net。当拖拽正在进行时,我需要停止部分表单刷新数据视图。

我尝试过使用一个标志,但我似乎没有抓住我需要的所有事件来保持标志与拖放进度同步。具体来说,我无法判断拖放操作何时结束而没有完成拖放操作,即当用户将项目放在控件上且允许drop = false时,或者当用户按下ESC键时。

我见过这个问题: -

Check if a drag&drop is in progress

但它没有令人满意地解决我的问题(如果有人给我这个问题的答案,我会回答那个答案和我已经有的答案)。

1 个答案:

答案 0 :(得分:18)

我没有接受者,最终想出来了。

答案是监视QueryContinueDrag事件。在拖放操作期间,此事件会不断触发。 QueryContinueDragEventArgs包含一个类型为enum DragAction的Action属性,它可以是DragAction.Cancel,DragAction.Drop或DragAction.Continue。它是一个读/写属性,以便您可以更改标准行为(我们不需要这样做)。

此示例代码假定DragDropInProgress标志在拖放开始时设置,并在成功完成拖放时重置。它捕获DragDrop结束,因为用户放弃了鼠标而没有超过拖放目标(拖放目标是MyControl1和MyControl2)或取消拖放。如果您不关心DragDropInProgressFlag是否在DragDrop事件触发之前被重置,您可以省略命中测试并重置标志。

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

在这个示例中,如果鼠标位置在任何控件矩形中,HitTest是一个占据鼠标位置(屏幕坐标)和一组控件并通过数组传递True的rountine。