如何在拖放过程中检测鼠标释放

4

我有一个自定义的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。 - Hans Passant
2个回答

4

Hans Passant在评论中所述, 要检查操作是否被取消,您可以使用返回值DragDropEffects,来自DragDrop.DoDragDrop()的。

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

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

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

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

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

All:将数据复制到放置目标中、从拖动源中删除数据并在放置目标中滚动。

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


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;
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接