我目前正在改进wpf应用程序中的拖放功能。因此,我想让源控件知道用户何时在目标控件上删除数据。我认为这种目标的机制是由QueryContinueDrag-event提供的。实际上我能够成功设置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?");
}
}
答案 0 :(得分:0)
我相信答案是因为QueryContinueDrag
事件有一个默认事件处理程序,它执行拖放操作所需的所有必要功能(例如,如果按下Esc键,则取消操作) 。通过提供自己的事件处理程序,您已覆盖默认功能,而不是将其替换为您自己的版本。
实现该处理程序的原因很少......我有一个使用自定义游标的拖放实现,不实现该处理程序。来自MSDN上的DragDrop.QueryContinueDrag
Attached Event页:
在拖动拖动源时,会连续引发QueryContinueDrag事件。您可以根据ESC,SHIFT,CTRL和ALT键的状态以及鼠标按钮的状态来处理此事件以确定哪些操作结束了拖放操作。如果按下ESC键,此事件的默认处理程序将取消拖放操作,如果释放鼠标按钮,则会删除数据。如果处理此事件以更改默认行为,请确保在处理程序中提供等效机制以结束拖放操作。否则,DoDragDrop方法将不会返回,您的应用程序将停止响应。如果您处理此事件,则必须将其标记为已处理,以防止默认行为覆盖您的处理程序。
您在该处理程序中尝试执行的任何操作都可以通过为PreviewDragOver
或PreviewDrop
事件实现处理程序并使用DragEventArgs
对象来完成。我希望有所帮助。
更新&gt;&gt;&gt;
正如我所说,你在QueryContinueDrag
事件处理程序中尝试做的任何事情都可以通过为PreviewDragOver
或PreviewDrop
事件实现处理程序并使用{{}来完成。 1}}对象。更具体地说,为了回答您的评论,您可以使用DragEventArgs
对象来检查操作是DragEventArgs
还是Copy
操作,如下所示:
Move