OnQueryContinueDrag-Event 在发生丢弃时不触发

本文关键字:OnQueryContinueDrag-Event | 更新日期: 2023-09-27 18:36:56

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

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?");
    }
}

OnQueryContinueDrag-Event 在发生丢弃时不触发

我相信

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

实现该处理程序的理由真的很少......我有一个带有自定义光标的工作拖放实现,它实现该处理程序。从 MSDN 上的"DragDrop.QueryContinueDrag附加事件"页:

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

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


更新>>>

正如我所说,您尝试在 QueryContinueDrag 事件处理程序中执行的任何操作都可以通过实现 PreviewDragOverPreviewDrop 事件的处理程序并使用 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
}
相关文章:
  • 没有找到相关文章