WPF鼠标位置无法正确检索

本文关键字:检索 鼠标 位置 WPF | 更新日期: 2023-09-27 18:11:06

披露:这是我的第一个WPF应用程序。请接受我的无知。

在我的WPF应用程序中,我有一个带有网格和各种子节点的ControlTemplate。在代码后面,我使用ControlTemplate动态地添加一个自定义ContentControl元素。

创建新控件时,它旨在捕获鼠标并允许拖动功能。如果网格已经加载到窗口上,并且我将起始点设置为MouseButtonEventArgs.GetPosition(窗口),那么拖动计算的代码就可以了。但是当事件在Grid初始加载时被触发时,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是不正确的。

WPF鼠标位置无法正确检索

你能试一下吗?我前一段时间遇到了这个问题,它对我来说很有效:

    [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;
    }