2015-09-03 92 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