【问题标题】:How to detect mouse release during drag-drop如何在拖放期间检测鼠标释放
【发布时间】:2012-07-09 21:39:27
【问题描述】:

我有一个处理拖放的自定义 WPF 控件。我重写 OnDragOver 以便控件在忙于执行其他操作时不会接受放置的对象:

protected override void OnDragOver(DragEventArgs e)
{
     base.OnDragOver(e);

     if (isBusy)     
          e.Effects = DragDropEffects.None;
     else
          e.Effects = DragDropEffects.Move;

     e.Handled = true;
}

在另一个启动拖放的控件中,有一些 UI 元素在操作开始时被禁用,如果操作被取消或在目标上释放鼠标时应该启用,而上面的目标说操作是不允许。

我可以在源代码管理中使用哪些事件来检查第二个条件?

【问题讨论】:

  • 只需使用 DoDragDrop() 的返回值即可。如果放置因任何原因未成功,您将获得 DragDropEffects.None。

标签: wpf drag-and-drop


【解决方案1】:

作为Hans Passant answered in a comment,查看操作是否被取消可以使用return value, DragDropEffectsDragDrop.DoDragDrop()

无:放置目标不接受数据。

复制:将数据复制到放置目标。

移动:拖动源中的数据被移动到放置目标。

链接:来自拖动源的数据链接到放置目标。

滚动:滚动即将开始或正在发生 放下目标。

全部:数据被复制,从拖动源中移除,并滚动 放置目标。

None是你感兴趣的值,当鼠标松开时操作会被取消,DoDragDrop()会返回None

【讨论】:

    【解决方案2】:

    当 WPF 拖放正在进行时,GiveFeedback 事件会在拖动源上持续触发,您可以检查事件参数状态并相应地更新拖动源。

    这是一个代码示例:(假设被拖动的元素称为dragSource)

    // Attach the event handler
    dragSource += OnDragSourceGiveFeedback;
    
    // Event Handler
    private void OnDragSourceGiveFeedback(object sender, GiveFeedbackEventArgs e)
        {
            if (e.Effects == DragDropEffects.None)
            {
                // Drop is not allowed on the Drop Target
                dragSource.IsEnabled = false;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      • 2019-12-15
      • 2021-04-25
      • 2022-07-12
      相关资源
      最近更新 更多