我怎么知道Drag Drop已经结束了WinForms .net。当拖拽正在进行时,我需要停止部分表单刷新数据视图。
我尝试过使用一个标志,但我似乎没有抓住我需要的所有事件来保持标志与拖放进度同步。具体来说,我无法判断拖放操作何时结束而没有完成拖放操作,即当用户将项目放在控件上且允许drop = false时,或者当用户按下ESC键时。
我见过这个问题: -
Check if a drag&drop is in progress
但它没有令人满意地解决我的问题(如果有人给我这个问题的答案,我会回答那个答案和我已经有的答案)。
答案 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。