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