如果在WPF中为DragLeave事件编写事件处理程序,则可以在事件的DragEventArgs e上调用e.GetPosition(sender as IInputElement)
。
我期望得到一个相对于控件(发送者)的Point,但是事实并非如此。相反,返回的Point看起来更像是相对于另一个控件的点,该点在离开此控件后立即输入。
那么我应该如何解释e.GetPosition(...)
的返回值?
答案 0 :(得分:0)
尽管从技术上讲这不是一个答案,但我认为我至少可以对您所看到的内容提供一个解释。这似乎是WPF中的API设计/文档问题,因为他们无法传达底层OLE拖放系统的这一方面。
如果比较IDropTarget::DragOver和IDropTarget::DragLeave,您会发现后者没有参数,而前者具有参数pt
,
在屏幕坐标中包含当前光标坐标的POINTL结构。
System.Windows.OleDropTarget
像这样“交易”:
int MS.Win32.UnsafeNativeMethods.IOleDropTarget.OleDragLeave()
{
if (this._lastTarget != null)
{
int num = 0;
try
{
this.RaiseDragEvent(DragDrop.DragLeaveEvent, 0, ref num, this._lastTarget, new Point(0, 0));
}
finally
{
this._lastTarget = null;
this._dataObject = null;
}
}
return 0;
}
请特别注意new Point(0, 0)
。
MSDN仅暗示此事件仅出于特定目的而存在:
您通常会处理此事件以撤消您在其中所做的任何更改 DragEnter事件处理程序。
存在bug report。
现在,对于解决方案,我建议在DragOver事件中进行所有基于位置的工作,因为这将足够接近。您还可以记住上一个DragOver事件中的位置,并直接使用它,或者在DragLeave中找到最接近的边缘点。另一种选择是使用一些本机互操作来获取鼠标位置。请注意,Mouse.GetPosition will not work。