Как мне узнать, закончился ли Drag Drop в Winforms? - PullRequest
8 голосов
/ 26 января 2009

Как я могу сказать, что Drag Drop закончил WinForms .net. Мне нужно, чтобы часть моей формы не обновляла представление данных во время перетаскивания.

Я пытался использовать флаг, но, похоже, я не фиксирую все события, которые мне нужны, чтобы синхронизировать флаг с ходом перетаскивания. В частности, я не могу сказать, когда операция перетаскивания заканчивается без завершения перетаскивания, то есть когда пользователь удаляет элемент в элементе управления с параметром allow drop = false или когда пользователь нажимает клавишу ESC.

Я видел этот вопрос: -

Проверьте, выполняется ли перетаскивание

Но это не решает мою проблему удовлетворительно (если кто-то даст мне ответ на этот вопрос, я отвечу на него с ответом вместе с тем, что у меня уже есть).

1 Ответ

18 голосов
/ 26 января 2009

Я не получил берущих и в конце концов понял это.

Ответ - отслеживать событие QueryContinueDrag. Это событие происходит постоянно во время операции перетаскивания. QueryContinueDragEventArgs содержит свойство Action типа enum DragAction, которое представляет собой 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, если позиция мыши находится в каком-либо из прямоугольников элементов управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...