WPF проверка, если контроль перетащен - PullRequest
0 голосов
/ 24 января 2020

Есть ли способ проверить, перетаскивает ли пользователь элемент управления в WPF? События для обработки начала-перетаскивания не работают в моем текущем приложении. Конечно, простой обходной путь можно реализовать, просто установив флаг bool, который устанавливается во время начала перетаскивания, поэтому перетаскивание можно рассматривать как активное.

К сожалению, это решение не является очень надежный, так как вы должны вручную сбросить этот флаг при отбрасывании - и подумать обо всех возможностях, которые могут привести к тому, что событие сброса никогда не произойдет (пользователь нажимает ES C, а не сбрасывает его в элемент управления allowDrop,. ..).

1 Ответ

0 голосов
/ 02 февраля 2020

У меня есть хакерское решение, которое я нашел, потратив много времени, пытаясь понять перетаскивание в WPF.

WPF InputManager, которое «отвечает за координацию всех систем ввода в WPF», технически обладает свойством, которое говорит о том, выполняется ли в данный момент операция перетаскивания.

/// <summary>
///     The InDragDrop property represents whether we are currently inside
///     a OLE DragDrop operation.
/// </summary>
internal bool InDragDrop

Выше приведено в официальном сообщении. NET Исходный код фреймворка. В частности, InputManager.cs.

Проблема в том, что по какой-то причине оно объявлено как свойство internal, поэтому мы не можем получить к нему доступ ... или, по крайней мере, мы ' не должен. Доступ к элементам internal и private по-прежнему возможен с помощью refection . Таким образом, InputManager.InDragDrop технически можно прочитать, выполнив следующее:

VB. NET

GetType(InputManager).GetProperty("InDragDrop", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance).GetValue(InputManager.Current)

C#:

typeof(InputManager).GetProperty("InDragDrop", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(InputManager.Current);

Я использовал это и он работает, но не является официально поддерживаемой функцией WPF, поэтому используйте его на свой страх и риск. Технически существует вероятность того, что Microsoft может изменить способ работы InputManager в будущем и удалить или переименовать это свойство, подумал лично, я в этом сомневаюсь.

...