0

我目前正在改进我的 wpf 应用程序中的拖放功能。因此,我想让源控件知道用户何时将数据放在目标控件上。我认为这种目标的机制是由 QueryContinueDrag 事件提供的。实际上,我能够成功设置 QueryContinueDrag 事件的集成:

private void TrvImport_OnPreviewMouseMove(object sender, MouseEventArgs e)
{
    Point mousePos = e.GetPosition(null);
    Vector diff = startPoint - mousePos;

    if (e.LeftButton == MouseButtonState.Pressed
        && (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance
            || Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance))
    {
        MailBox transportBox = new MailBox();
        transportBox.DocumentList = new ObservableCollection<Domain.Document>();

        DataObject dragData = new DataObject("MailBox", transportBox);
        DragDrop.DoDragDrop(TrvImport, dragData, DragDropEffects.All);
    }
}

现在,只要我开始拖放,就会定期执行下面的事件方法。但是,当我通过释放鼠标按钮完成拖放时,不会再次使用e.Action == DragAction.Drop参数触发事件 - 正如我所期望的那样。为什么?

private void TrvImport_OnQueryContinueDrag(object sender, QueryContinueDragEventArgs e)
{
    if (e.Action != DragAction.Continue)
    {
        Console.WriteLine("This Line is never executed, why?");
    }
}
4

1 回答 1

0

我相信答案是因为事件有一个默认的事件处理程序,QueryContinueDrag它执行拖放操作所需的所有必要功能(例如,如果按下 Escape 键则取消操作)。通过提供您自己的事件处理程序,您已经覆盖了默认功能,而不是用您自己的版本替换它。

实现该处理程序的原因确实很少......我有一个使用自定义光标的工作拖放实现,它没有实现该处理程序。从 MSDN 上的DragDrop.QueryContinueDrag附加事件页面:

QueryContinueDrag 事件在拖动源被拖动时连续引发。您可以处理此事件,以根据 ESC、SHIFT、CTRL 和 ALT 键的状态以及鼠标按钮的状态来确定结束拖放操作的操作。此事件的默认处理程序在按下 ESC 键时取消拖放操作,并在释放鼠标按钮时丢弃数据。如果您处理此事件以更改默认行为,请务必在您的处理程序中提供等效机制来结束拖放操作。否则,DoDragDrop 方法将不会返回并且您的应用程序将停止响应。如果您处理此事件,则必须将其标记为已处理,以防止默认行为覆盖您的处理程序。

您试图在该处理程序中执行的任何操作都可以通过为PreviewDragOverPreviewDrop事件实现处理程序并使用该DragEventArgs对象来完成。我希望这会有所帮助。


更新>>>

正如我所说,您在事件处理程序中尝试执行的任何操作QueryContinueDrag都可以通过为PreviewDragOverorPreviewDrop事件实现处理程序并使用DragEventArgs对象来完成。更具体地说,要回答您的评论,您可以使用该DragEventArgs对象来检查操作是否是这样的Copy操作Move

if ((e.Effects & DragDropEffects.Copy) == DragDropEffects.Copy)
{
    // It's a copy operation
}
else if ((e.Effects & DragDropEffects.Move) == DragDropEffects.Move)
{
    // It's a move operation
}
于 2013-10-25T13:53:19.247 回答