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?");
}
}
答案是因为QueryContinueDrag
事件有一个默认事件处理程序,它执行拖放操作所需的所有必要功能(例如,如果按下 Esc 键,则取消操作)。通过提供自己的事件处理程序,您已经重写了默认功能,而不是将其替换为您自己的版本。
实现该处理程序的理由真的很少......我有一个带有自定义光标的工作拖放实现,它不实现该处理程序。从 MSDN 上的"DragDrop.QueryContinueDrag
附加事件"页:
拖动拖动源时,将持续引发 QueryContinueDrag 事件。您可以处理此事件,以根据 ESC、SHIFT、CTRL 和 ALT 键的状态以及鼠标按钮的状态来确定结束拖放操作的操作。如果按下 ESC 键,此事件的默认处理程序将取消拖放操作,如果释放鼠标按钮,则会删除数据。如果处理此事件以更改默认行为,请确保在处理程序中提供等效机制以结束拖放操作。否则,DoDragDrop 方法将不会返回,并且您的应用程序将停止响应。如果处理此事件,则必须将其标记为已处理,以防止默认行为覆盖处理程序。
您尝试在该处理程序中执行的任何操作都可以通过实现PreviewDragOver
或PreviewDrop
事件的处理程序并使用 DragEventArgs
对象来完成。我希望这有所帮助。
更新>>>
正如我所说,您尝试在 QueryContinueDrag
事件处理程序中执行的任何操作都可以通过实现 PreviewDragOver
或 PreviewDrop
事件的处理程序并使用 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
}