从屏幕上的鼠标光标位置获取图像坐标(WPF图像控件)

时间:2017-06-16 09:13:26

标签: c# wpf xaml zoom pan

我一直在寻找一种透明添加平移和解决方案的解决方案缩放到WPF图像控件的功能,我找到了由https://stackoverflow.com/a/6782715/584180Wiesław Šoltés开发的解决方案Konrad Viltersten,该解决方案非常出色。

现在我想在控件中添加一个“鼠标点击”事件,以便我可以在原始图像坐标系中找到点击点的坐标,这样我就可以使用它们来检索像素颜色。

我知道会有一些舍入,如果图像缩小,颜色将与屏幕上显示的实际颜色不对应。我也明白,用户可能会在图像边框外单击,在这种情况下,我希望返回零点或负坐标。

我不是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; // Wrong: how do I transform this?
    }

    return null;
}

2 个答案:

答案 0 :(得分:6)

为了将来的参考,我想要实现的是:

    public Point GetImageCoordsAt(MouseButtonEventArgs e)
    {
        if (child != null && child.IsMouseOver)
        {
            var controlSpacePosition = e.GetPosition(child);
            var imageControl = this.Child as Image;
            var mainViewModel = ((MainViewModel)base.DataContext);
            if (imageControl != null && imageControl.Source != null)
            {
                // Convert from control space to image space
                var x = Math.Floor(controlSpacePosition.X * imageControl.Source.Width / imageControl.ActualWidth);
                var y = Math.Floor(controlSpacePosition.Y * imageControl.Source.Height / imageControl.ActualHeight);

                return new Point(x, y);
            }
        }
        return new Point(-1, -1);
    }

返回原始图像系统中鼠标指针的坐标。

答案 1 :(得分:1)

mm8建议你可以使用e.GetPosition(child);获得所需的位置 ,没有必要进行任何转换。出于测试目的,我已经覆盖了重置行为。使用the link you provided中的代码,更改

void child_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    this.Reset();
}

public Point GetImageCoordsAt(MouseButtonEventArgs e)
{
    if (child != null && child.IsMouseOver)
    {
        return e.GetPosition(child);
    }
    return new Point(-1, -1);
}

void child_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    MessageBox.Show(GetImageCoordsAt(e).ToString());
}

如果右键单击图像中的相同位置,无论平移和缩放如何,您都将获得(大致)相同的坐标。