从鼠标光标在屏幕上的位置获取图像坐标(WPF 图像控件)
从鼠标光标在屏幕上的位置获取图像坐标(WPF 图像控件)
我正在寻找一种透明地为WPF Image控件添加平移和缩放功能的解决方案,我找到了由Wiesław Šoltés和Konrad Viltersten开发的解决方案https://stackoverflow.com/a/6782715/584180,非常出色。
现在我想在控件中添加一个“鼠标点击”事件,以便我可以获取原始图像坐标系中点击点的坐标,以便我可以使用它们来获取像素颜色。
我知道会有一些四舍五入,如果图像被缩小,颜色将不对应屏幕上实际显示的颜色。我也知道用户可能会点击在图像边界之外,这种情况下我希望返回一个空点或负坐标。
我不是C#转换的专家,目前我在这个问题上卡住了(要添加到ZoomBorder.cs类中的代码):
public Point GetImageCoordsAt(MouseButtonEventArgs e) { if (child != null) { var tt = GetTranslateTransform(child); var mousePos = e.GetPosition(this); var transformOrigin = new Point(tt.X, tt.Y); return mousePos; // 错误:我如何转换这个? } return null; }
问题的出现原因是需要从鼠标光标在屏幕上的位置获取图像的坐标。解决方法是使用WPF Image控件中的e.GetPosition(child);
方法来获取所需的位置。通过重写重置行为,可以使用来自提供的链接中的代码来实现。将void child_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
更改为public Point GetImageCoordsAt(MouseButtonEventArgs e)
方法来获取图像的坐标,然后在child_PreviewMouseRightButtonDown
方法中调用GetImageCoordsAt(e)
方法并显示结果。这样,无论平移和缩放的情况如何,如果在图像中的相同位置右击,将获得(大致)相同的坐标。虽然该解决方法仍然根据Image控件的大小给出坐标,而不是原始的BitmapSource,但作者可以自己进行转换。
问题出现的原因:我想要实现的目标是通过鼠标指针在原始图像系统中返回鼠标指针的坐标。我尝试了一些代码,但没有得到预期的结果。
解决方法:根据给出的代码,可以看出解决方法如下:
1. 首先,判断child是否为空且鼠标是否悬停在child上。
2. 如果imageControl不为空且imageControl.Source不为空,则进行以下操作:
a. 将鼠标位置转换为相对于child的控件空间位置。
b. 获取imageControl的宽度和高度。
c. 将控件空间位置转换为图像空间位置。
d. 返回图像空间位置的坐标。
这样,无论是什么Stretch模式,还是在ScrollViewer中,都可以正常工作。这个解决方法解决了我的问题。