DragLeave EventArgs中e.GetPosition(...)返回值的含义是什么?

时间:2019-07-05 13:52:09

标签: wpf drag-and-drop

如果在WPF中为DragLeave事件编写事件处理程序,则可以在事件的DragEventArgs e上调用e.GetPosition(sender as IInputElement)。 我期望得到一个相对于控件(发送者)的Point,但是事实并非如此。相反,返回的Point看起来更像是相对于另一个控件的点,该点在离开此控件后立即输入。

那么我应该如何解释e.GetPosition(...)的返回值?

1 个答案:

答案 0 :(得分:0)

尽管从技术上讲这不是一个答案,但我认为我至少可以对您所看到的内容提供一个解释。这似乎是WPF中的API设计/文档问题,因为他们无法传达底层OLE拖放系统的这一方面。

如果比较IDropTarget::DragOverIDropTarget::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