Wpf dragdrop, как визуально отклонить падение при перетаскивании? - PullRequest
5 голосов
/ 02 ноября 2009

Во время перетаскивания в Wpf, как можно изменить курсор мыши (или, возможно, с помощью рекламного элемента), чтобы указать, что droptarget не примет перетаскиваемый элемент?

Я пытался установить e.Effects = DragDropEffects.None во время события DragEnter, но это не работает, и я подозреваю, что неправильно понял, для чего эта функция должна использоваться. Я пытался использовать событие GiveFeedback, но не понимаю, как droptarget может повлиять на него.

Существуют ли учебники, которые охватывают отклонение droptarget в Wpf?

Ответы [ 3 ]

6 голосов
/ 02 ноября 2009

Просто сработает установка DragDropEffects в DragEnter цели перетаскивания. Ваш DragEnter даже получает вызов. Вы установили AllowDrop на элементе управления цели?

Это последовательность событий во время перетаскивания в WPF (взято из MSDN), которая может помочь понять, что происходит ...

  1. Перетаскивание инициируется вызовом метода DoDragDrop для управления исходным кодом.

    Метод DoDragDrop принимает два параметра: * данные, указывающие данные для передачи * allowEffects, определяющее, какие операции (копирование и / или перемещение) разрешены

    Новый объект DataObject создается автоматически.

  2. Это, в свою очередь, вызывает событие GiveFeedback. В большинстве случаев вам не нужно беспокоиться о событии GiveFeedback, но если вы хотите отобразить пользовательский указатель мыши во время перетаскивания, это то место, где вы должны добавить свой код.
  3. Любой элемент управления со свойством AllowDrop, установленным в True, является потенциальной целью отбрасывания. Свойство AllowDrop можно установить в окне «Свойства» во время разработки или программно в событии Form_Load.
  4. Когда мышь проходит над каждым элементом управления, возникает событие DragEnter для этого элемента управления. Метод GetDataPresent используется, чтобы убедиться, что формат данных соответствует целевому элементу управления, а свойство Effect используется для отображения соответствующего указателя мыши.
  5. Если пользователь отпускает кнопку мыши над допустимой целью перетаскивания, возникает событие DragDrop. Код в обработчике событий DragDrop извлекает данные из объекта DataObject и отображает их в целевом элементе управления.
0 голосов
/ 01 февраля 2016

Вы не сказали, используете ли вы даже DragOver. Возможно, вы устанавливаете e.Effect = DragDropEffects.All; в этом четном режиме, и он будет срабатывать несколько раз после того, как вы введете целевой элемент управления вместо DragEnter, который будет срабатывать только один раз.

    private void arbol_DragOver(object sender, DragEventArgs e)
    {
        if (some_reason)
            e.Effect = DragDropEffects.None;
        else
            e.Effect = DragDropEffects.All;
    }

Если вы не использовали это событие или не изменяли e.Effect внутри, то трудно сказать. Код нужен.

0 голосов
/ 25 апреля 2013

У меня была похожая проблема, потому что я изменил курсор в обработчике GiveFeedback. Этот курсор использовался даже при удалении цели. После переключения обратно на курсор по умолчанию (e.UseDefaultCursors = true) форма курсора действительно изменилась на «не разрешено».

...