Я переношу перетащить/отбросить операцию на Холсте, который, как предполагается, делает что-то, когда объект перетаскивается в и из него. Моя проблема состоит в том, что события DragEnter/DragLeave продолжают стрелять как перемещения мыши, которые объект по нему, не только на вводят/выходят. Чем быстрее мышь перемещается, тем более часто события стреляют.
Холст Событие DragOver перемещает Холст. Главный/Левый из DraggedObject и я думаю, что это могло бы быть моей проблемой, но я не уверен, как я зафиксировал бы это.
Вот последовательность событий:
DragEnter
запускается на холсте. DragEnter
перемещает Panel так, чтобы она оказалась под курсором мыши. Поскольку указатель мыши больше не находится над холстом (он находится над панелью), запускается событие DragLeave
. Чем быстрее вы перемещаете мышь, тем больше событий вы получите.
Суть вашей проблемы в том, что при перетаскивании используется проверка попадания, и, перемещая панель, вы лишаетесь возможности проверки нажатия, чтобы видеть «за» вашей панелью, чтобы знать, в какой контейнер она сбрасывается.
Решение состоит в том, чтобы использовать свой собственный код для обработки перетаскивания, что на самом деле совсем несложно. Механизм проверки попадания в WPF достаточно мощный, чтобы выполнять проверку попадания за текущим объектом, но перетаскивание не использует эту функциональность. Однако вы можете использовать его напрямую, используя перегрузку VisualTreeHelper.HitTest
, которая принимает HitTestFilterCallback
и HitTestResultCallback
. Просто передайте ему фильтр, который игнорирует любые попадания в перетаскиваемую панель.
Я обнаружил, что для описанных вами сценариев выполнение перетаскивания путем обработки событий мыши на самом деле проще, чем использование встроенного DoDragDrop, потому что вам не нужно иметь дело со сложностью (DataObject, DragDropEffects, QueryContinueDrag и т. Д. ). Эта дополнительная сложность очень важна для включения сценариев перетаскивания между приложениями и процессами, но не помогает вам в том, что вы делаете.
Вот простое решение:
Наслаждайтесь.