首页 > 解决方案 > 如何在 WPF (C#) 中获取鼠标移动方向

问题描述

我想在 WPF 中跟踪鼠标移动方向(左/右/上/下/对角线)。我在stackoverflow上看到了这个答案但这对我不起作用。所以我写了一些如下所示的代码 这就是我的逻辑的工作原理 首先,只要鼠标在窗口上移动并且没有按住右键,我就会得到以前的鼠标位置。当按住右键并且鼠标移动时,我获取当前位置并将当前位置和上一个位置都传递给返回方向的 GEtMouseDirection()。问题是这样的,该方法在 7/10 的时间将方向返回为“NONE”。但是另外 3/10 的时间,它给出了正确的方向,所以我在想的是鼠标移动事件被如此频繁地触发,以至于“currentPosition”和“previousPosition”几乎总是相同的。我不不希望这种情况发生,因为我需要它是准确的。

另外值得注意的是,我已经尝试为 ImageControl 和 Border 处理鼠标移动事件。但是但是返回相同的结果。所以我很确定问题不在于我选择在哪里处理鼠标移动事件。

var pTx = imageControl.TransformToAncestor(imageBorder).Transform(new System.Windows.Point(0, 0));

现在谈到我想要获得准确的鼠标移动方向的原因,我正在使用图像查看器并且我想限制平移,例如图像缩放,鼠标向右移动并且图像的左侧已经是与包含我的图像的边框的左侧对齐。(即当 pTx.X >=0 时。有没有人有更好的解决方案来了解如何获得鼠标移动方向或在图像已经对齐时如何限制平移?

('pre' 表示以前的鼠标位置,'cur' 表示当前位置)。

    public static MouseDirection GetMouseDirection(Point pre, Point cur)
    {
        // Mouse moved up
        if ((pre.X == cur.X) && (pre.Y > cur.Y))
            return MouseDirection.Up;

        // Mouse moved down
        if ((pre.X == cur.X) && (pre.Y < cur.Y))
            return MouseDirection.Down;

        // Mouse moved left
        if ((pre.X > cur.X) && (pre.Y == cur.Y))
            return MouseDirection.Left;

        // Mouse moved right
        if ((pre.X < cur.X) && (pre.Y == cur.Y))
            return MouseDirection.Right;

        // Mouse moved diagonally up-right
        if ((pre.X < cur.X) && (pre.Y > cur.Y))
            return MouseDirection.TopRight;
        //return MouseDirection.Up;

        // Mouse moved diagonally up-left
        if ((pre.X > cur.X) && (pre.Y > cur.Y))
            return MouseDirection.TopLeft;
        //return MouseDirection.Up;

        // Mouse moved diagonally down-right
        if ((pre.X < cur.X) && (pre.Y < cur.Y))
            return MouseDirection.BottomRight;
        //return MouseDirection.Down;

        // Mouse moved diagonally down-left
        if ((pre.X > cur.X) && (pre.Y < cur.Y))
            return MouseDirection.BottomLeft;
        //return MouseDirection.Down;

        // Mouse didn't move
        return MouseDirection.None;
    }

标签: c#wpfmousemovepanning

解决方案


我修复了我的解决方案。下面是我的代码

鼠标方向枚举

public enum MouseDirection
{
    None,
    Up,
    Down,
    Left,
    Right,
    TopLeft,
    TopRight,
    BottomLeft,
    BottomRight,
}

计算鼠标方向的方法

    public static MouseDirection GetMouseDirection(Point pre, Point cur)
    {
        // Mouse moved up
        if ((pre.X == cur.X) && (pre.Y > cur.Y))
            return MouseDirection.Up;

        // Mouse moved down
        if ((pre.X == cur.X) && (pre.Y < cur.Y))
            return MouseDirection.Down;

        // Mouse moved left
        if ((pre.X > cur.X) && (pre.Y == cur.Y))
            return MouseDirection.Left;

        // Mouse moved right
        if ((pre.X < cur.X) && (pre.Y == cur.Y))
            return MouseDirection.Right;

        // Mouse moved diagonally up-right
        if ((pre.X < cur.X) && (pre.Y > cur.Y))
            return MouseDirection.TopRight;
        //return MouseDirection.Up;

        // Mouse moved diagonally up-left
        if ((pre.X > cur.X) && (pre.Y > cur.Y))
            return MouseDirection.TopLeft;
        //return MouseDirection.Up;

        // Mouse moved diagonally down-right
        if ((pre.X < cur.X) && (pre.Y < cur.Y))
            return MouseDirection.BottomRight;
        //return MouseDirection.Down;

        // Mouse moved diagonally down-left
        if ((pre.X > cur.X) && (pre.Y < cur.Y))
            return MouseDirection.BottomLeft;
        //return MouseDirection.Down;

        // Mouse didn't move
        return MouseDirection.None;
    }

鼠标移动事件处理程序和属性

    static System.Windows.Point pre = new System.Windows.Point();
    static System.Windows.Point cur = new System.Windows.Point();

    private void Panel2_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.LeftButton == MouseButtonState.Pressed)
        {
            cur = e.GetPosition(panel2);

            bool mouseMoved = (pre != cur);

            if (mouseMoved)
                direction = MouseMovement.GetMouseDirection(pre, cur);

            pre = cur;
        }
        else
            pre = e.GetPosition(panel2);
    }

推荐阅读