【问题标题】:WPF Mouse Position not retrieved properlyWPF 鼠标位置未正确检索
【发布时间】:2015-09-03 14:23:41
【问题描述】:

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

在我的 WPF 应用程序中,我有一个带有 Grid 的 ControlTemplate 和下面的各种子项。在代码隐藏中,我使用 ControlTemplate 动态添加自定义 ContentControl 元素。

创建新控件时,它旨在捕获鼠标并允许拖动功能。如果 Grid 已经加载到窗口上并且我将起点设置为 MouseButtonEventArgs.GetPosition(window),则用于拖动计算的代码很好。但是当最初加载 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 和 WIndows 窗体都已经支持拖放,包括 DragEnter、DragOver、Drop 事件。您应该处理正确的事件,而不是尝试捕获鼠标位置。检查Drag & Drop Overview
  • 拖放只处理父窗口上的移动,对吗?我之前尝试过实现它,但应用程序的要求是能够从窗口中拖动控件。 (在浏览器上思考标签)
  • 没有。否则 DragEnter 事件没有多大意义。拖放是 Windows 操作,而不是视觉效果。它甚至不必以单击和拖动开始,您的应用程序可以使用 DoDragDrop 以编程方式发出拖动开始信号。例如,Visual Studio 中的控件工具箱会在您单击控件时启动拖动操作。
  • 太棒了。我想我会更多地研究那个。谢谢。

标签: c# wpf


【解决方案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;
    }

【讨论】:

  • 这将获得鼠标相对于整个屏幕的位置。如果我不得不猜测这不是 OP 想要的。
  • 我正在尝试将所有内容转换为根据问题上的 cmets 使用 DragDrop 方法。这可能会起作用,因为我可以将窗口的位置与鼠标位置进行比较并将其作为我的偏移量。感谢您实际回答我的问题,雅典娜
  • 所以当我实现这个方法时,GetCursorPosition 会返回类似 (4.73e-312,0) 的东西。有什么明显的我搞砸了吗?因为那显然是错误的。
  • 抱歉,rosst 延迟,我为 POINT 结构添加了必要的编辑。
猜你喜欢
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多