2015-09-03 64 views
0

披露:这是我的第一个WPF应用程序。请接受我的无知。未正确检索WPF鼠标位置

在我的WPF应用程序,我有一个网格并且在其下方的各种孩子的ControlTemplate。在代码隐藏中,我使用ControlTemplate动态添加自定义的ContentControl元素。

在创建新的控制,它的目的是捕获鼠标,并允许拖动功能。如果网格已经加载到窗口上并且我将起始点设置为MouseButtonEventArgs.GetPosition(window),则拖动计算的代码很好。但是当网格最初被加载时,事件被触发时,Point等于窗口的反向位置。例如。如果我的窗口在(350,250),我的起点是(-350,-250)。

private void GridLoaded(object sender, EventArgs e) { // fires MouseLeftButtonDown event for grid} 

private void MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { 
    ... 
    m_start = e.GetPosition(this); // 'this' is the current window; returns the inverse coordinates of 'this' 
    ... 
} 

有没有更合适的方法来获得X,我的鼠标位置的y坐标。如果有必要,我可以使用屏幕坐标,但是我找到的所有代码都使用PointToScreen(m_start)。这是毫无用处的,因为m_start不正确。

任何帮助,非常感谢。

+3

WPF和Windows窗体已经有拖放支持,包括dragEnter事件,的dragover,放事件。您应该处理正确的事件,而不是试图捕获鼠标位置。检查[拖放概述】(https://msdn.microsoft.com/en-us/library/vstudio/ms742859(V = VS.100)的.aspx) –

+0

拖放只处理父窗口上运动,正确?我曾试图实现它,但是应用程序的一个要求是能够从窗口拖动控件。 (想想浏览器上的选项卡) – rosst

+1

否。在DragEnter事件中不会有太多的意义。拖放是一种* Windows *操作,不是视觉效果。它甚至不必以点击和拖动开始,您的应用程序可以通过DoDragDrop以编程方式指示拖动启动。例如,Visual Studio中的控件工具箱,当您在控件上单击*时会启动拖动。 –

回答

1

你可以试试,我前一段时间钩住这个和它的工作很适合我:

[StructLayout(LayoutKind.Sequential)] 
    public struct POINT 
    { 
     public int X; 
     public int Y; 

     public static implicit operator Point(POINT point) 
     { 
      return new Point(point.X, point.Y); 
     } 
    } 

    [DllImport("user32.dll")] 
    public static extern bool GetCursorPos(out POINT lpPoint); 

    public static Point GetCursorPosition() 
    { 
     POINT lpPoint; 
     GetCursorPos(out lpPoint); 
     //bool success = User32.GetCursorPos(out lpPoint); 
     // if (!success) 

     return lpPoint; 
    } 
+0

这将获得鼠标相对于整个屏幕的位置。如果我不得不猜测这不是OP想要的。 – Demarini

+0

我试图转换一切,以便根据问题的评论使用DragDrop方法。这可能会起作用,因为我可以将窗口的位置与鼠标位置进行比较,并将其作为我的偏移量。感谢您实际回答我的问题,Athena – rosst

+0

因此,当我实现此方法时,GetCursorPosition会返回类似(4.73e-312,0)的内容。任何显而易见的东西我搞砸了?因为这显然是错误的。 – rosst