gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:22:20 24 4
gpt4 key购买 nike

我怎么知道是拖放已结束WinForms .net。当拖放正在进行时,我需要停止刷新表单的数据 View 。

我尝试使用标志,但是似乎并没有捕获保持标志与拖放进度同步所需的所有事件。具体来说,我无法确定拖放操作何时结束而不完成拖放操作,即用户何时将其放置在允许drop = false的控件上,或者何时按下ESC键。

我已经看到了这个问题:

Check if a drag&drop is in progress

但这不能令人满意地解决我的问题(如果有人给我这个问题的答案,我会连同我已经得到的答案一起回答那个问题)。

最佳答案

我没有参加者,最终想到了这一点。

答案是监视QueryContinueDrag事件。在拖放操作期间,此事件连续触发。 QueryContinueDragEventArgs包含枚举DragAction类型的Action属性,该属性可以是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

在此示例中,HitTest是一种常规方法,它占据Mouse位置(屏幕坐标)和一个控件数组,并在鼠标控件位于任何控件矩形中的情况下筛选通过True的数组。

关于.net - 如何判断拖放在Winforms中是否结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/480156/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com