Arhn - архитектура программирования

Как узнать, закончилось ли перетаскивание в Winforms?

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

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

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

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

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

26.01.2009

Ответы:


1

У меня не было желающих, и в конце концов я понял это.

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

26.01.2009
  • Ты обалденный! Именно то, что мне нужно, с хорошей реализацией для проверки попадания на определенные элементы управления. Умная. 14.09.2009
  • Если clt.ClientRectangle.Contains(ClientPoint), то: HitTest = True: выход для: конец, если 14.09.2009
  • : добавлено только для отображения разрывов строк (даже несмотря на то, что оператор будет работать на показанном). 14.09.2009
  • :) Очень рад помочь! Не называйте УДИВИТЕЛЬНЫМ достаточно часто... Не стесняйтесь редактировать свой более читаемый код. 22.09.2010
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..