我花了很多时间尝试了解 WPF 中的拖放操作,然后想出了一个老套的解决方案。
“负责协调 WPF 中的所有输入系统”的 WPF InputManager 在技术上确实有一个属性来说明当前是否正在进行拖放操作。
/// <summary>
/// The InDragDrop property represents whether we are currently inside
/// a OLE DragDrop operation.
/// </summary>
internal bool InDragDrop
以上来自官方.NET Framework源码。特别是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 的工作方式并删除或重命名此属性,我个人认为我对此表示怀疑。