【问题标题】:WPF check if control is draggedWPF检查控件是否被拖动
【发布时间】:2020-01-24 16:56:22
【问题描述】:

有没有办法检查用户当前是否在 WPF 中拖动控件?处理开始拖放的事件在我当前的应用程序中不起作用。当然,一个简单的解决方法可以通过设置一个 bool-flag 来实现,该标志是在 start-drag 期间设置的,因此可以将 drag-n-drop 视为活动。

不幸的是,该解决方案不是很健壮,因为您必须在放置时手动重置该标志 - 并且必须考虑所有可能导致放置事件永远不会发生的可能性(用户按下 ESC,而不是进入一个 allowDrop 控件,...)。

【问题讨论】:

    标签: wpf drag-and-drop


    【解决方案1】:

    我花了很多时间尝试了解 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 属性,所以我们无法访问它……或者至少我们不应该这样做。 internalprivate 成员仍然可以使用 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 的工作方式并删除或重命名此属性,我个人认为我对此表示怀疑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 2010-09-18
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      相关资源
      最近更新 更多