.net 如何判断拖放是否已在Winforms中结束?

.net 如何判断拖放是否已在Winforms中结束?,.net,winforms,.net,Winforms,如何判断拖放是否已结束WinForms.net。当拖放正在进行时,我需要停止部分表单刷新其数据视图 我尝试过使用一个标志,但我似乎没有捕获所有需要保持标志与拖放进度同步的事件。具体来说,我无法判断何时在拖放未完成的情况下结束拖放操作,即当用户在允许拖放=false的控件上拖放项目时,或者当用户按下ESC键时 我看到这个问题:- 但这并不能令人满意地解决我的问题(如果有人给我这个问题的答案,我会用我已经有的答案来回答这个问题)。我没有人愿意接受,最终解决了这个问题 答案是监视QueryConti

如何判断拖放是否已结束WinForms.net。当拖放正在进行时,我需要停止部分表单刷新其数据视图

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

我看到这个问题:-


但这并不能令人满意地解决我的问题(如果有人给我这个问题的答案,我会用我已经有的答案来回答这个问题)。

我没有人愿意接受,最终解决了这个问题

答案是监视QueryContinueDrag事件。此事件在拖放操作期间持续激发。QueryContinueDragEventArgs包含enum DragAction类型的操作属性,该属性为DragAction.Cancel、DragAction.Drop或DragAction.Continue。它是一个读/写属性,允许您更改标准行为(我们不需要此属性)

此示例代码假定DragDropInProgress标志在拖放开始时设置,并在成功完成拖放时重置。它捕捉到一个DragDrop结束,因为用户没有经过拖放目标(拖放目标是MyControl1和MyControl2)就松开了鼠标,或者取消了拖放。如果您不在乎DragDrop事件触发前是否重置了DragDropInProgressFlag,则可以省去命中测试,只重置该标志

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
Private子MyControl\u QueryContinueDrag(ByVal sender作为对象,ByVal e作为System.Windows.Forms.QueryContinueDragEventArgs)处理MyControl.QueryContinueDrag
调暗鼠标位置作为点=鼠标位置
如果e.Action=DragAction.Cancel,则“”用户按下了退出按钮
DragDropInProgressFlag=False
如果结束
如果e.Action=DragAction.Drop,则
如果没有HitTest(新的{MyControl1,MyControl2},mousepinterlocation),则
DragDropInProgressFlag=False
如果结束
如果结束
端接头
私有函数HitTest(ByVal ctls()作为控件,ByVal p作为点)作为布尔值
HitTest=错误
对于ctl中的每个ctl
Dim ClientPoint As Point=ctl.POINTOTOClient(p)

HitTest=HitTest或(ClientPoint.X>=0 AndAlso ClientPoint.Y>=0 AndAlso ClientPoint.X你真是太棒了!这正是我在特定控件上实现hit测试所需要的。聪明。如果clt.ClientRectangle.Contains(ClientPoint)那么:HitTest=True:退出:结束如果:添加只是为了显示换行符(即使这个语句在显示时也能工作。):)很高兴能帮上忙!不要经常被称为AWESOME…请随意使用可读性更强的代码进行编辑。