c# - 如何在 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;
}
解决方案
我修复了我的解决方案。下面是我的代码
鼠标方向枚举
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);
}
推荐阅读
- javascript - Jimdo:SoundCloud-Player 歌曲结束时停止动画
- reactjs - 移除 React 包装器 div
- laravel - Laravel 将 CSRF 令牌放入移动应用程序
- javascript - ARIA 用于筛选表行的选择列表?
- javascript - 如何从 Angular5 组件 mydaterangepicker 中删除“位置:绝对”?
- ios - React Native Swift UI 组件框架大小
- apache-spark - 读取带有特殊字符的 ORC Spark DataFrames
- c - 减去 C 中的无符号整数并获得 -Wconversion 警告
- editor - Adobe 的括号编辑器,运行脚本扩展,它们可以与最新的 v 一起使用吗?
- javascript - document.querySelector 选择不同的按钮