如何在WPF(C#)中获取鼠标移动方向

问题描述 投票:0回答:1

我想在WPF中跟踪鼠标移动方向(左/右/上/下/对角线)。我看到this answer on stackoverflow但它对我不起作用。所以我写了一些代码,如下所示。这就是我的逻辑工作原理首先,当鼠标在窗口上移动并且没有按下右键时,我得到前一个鼠标位置。当按住右键并且鼠标移动时,我获得当前位置并将当前位置和先前位置传递给GEtMouseDirection(),返回方向。问题是这个,该方法在7/10的时间内返回方向为“无”。但是其他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# wpf mousemove panning
1个回答
1
投票

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

鼠标方向枚举

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);
    }
© www.soinside.com 2019 - 2024. All rights reserved.