如何在拖放期间检测鼠标释放

时间:2012-07-09 21:39:28

标签: wpf drag-and-drop

我有一个自定义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元素在操作开始时被禁用,并且如果操作被取消或者当目标在上面的目标上显示鼠标时在目标上被释放则应该启用不允许操作。

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

2 个答案:

答案 0 :(得分:3)

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

  

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

     

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

     

移动:来自拖动源的数据将移动到放置目标。

     

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

     

滚动:滚动即将开始或正在进行中   放下目标。

     

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

None是您感兴趣的值。当鼠标释放时,操作将被取消,DoDragDrop()将返回None

答案 1 :(得分:0)

WPF Drag& Drop正在进行中,GiveFeedback事件在拖动源上不断被触发,你可以检查事件参数state&相应地更新拖动源。

这是一个代码示例:(假设被拖动的元素称为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;
        }
    }