【发布时间】:2019-07-10 01:23:27
【问题描述】:
我想在 WPF 中跟踪鼠标移动方向(左/右/上/下/对角线)。我看到了this answer on 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;
}
【问题讨论】:
-
像
Vector.AngleBetween(cur - pre, new Vector(0, 1))这样的东西怎么样? -
没试过。但是我如何从这个等式中得到方向呢?它返回一个双精度。
-
这是一个角度......就像指南针一样。