2012-07-09 114 views
2

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

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

+3

只需使用DoDragDrop()的返回值即可。如果由于任何原因导致放弃不成功,您将得到DragDropEffects.None。 – 2012-07-09 22:00:11

回答

0

虽然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; 
     } 
    } 
2

Hans Passant answered in a comment如,检查操作是否被取消可以使用return value, DragDropEffects,的DragDrop.DoDragDrop()

无:下降目标不接受数据。

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

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

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

滚动:滚动即将开始或当前正在发生在 放置目标中。

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

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