【问题标题】:How I get the X and the Y point of a image from a MouseEvent?如何从 MouseEvent 获取图像的 X 和 Y 点?
【发布时间】:2014-05-15 15:48:22
【问题描述】:

我有一个图像编辑程序,需要图像的 X 和 Y 坐标。目前我使用 MouseLeftButtonDown 和 MouseRightButtonDown 事件。

<Image Name="Image" MouseLeftButtonDown="MouseLeftButtonDown_Click" MouseRightButtonDown="MouseRightButtonDown_Click"></Image>

我遇到的问题是我的 WPF 表单中的图片位置不正确。意思是,如果我把窗口拖得更小,坐标就会改变。

我的方法是这样的:

private void MouseLeftButtonDown_Click(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    System.Windows.Point p = e.GetPosition(null);
    MessageBox.Show(p.X.ToString());
}

我认为问题在于我在e.GetPosition 中添加了null 作为参数。但是我不知道我必须在这里添加什么......

例如,我打开一个 1920x1080 的图像,我真的想要 1920 和 1080,如果我 在右下角按下鼠标。

【问题讨论】:

    标签: c# wpf image events mouse


    【解决方案1】:

    听起来好像您想要相对于原始图像的像素的位置,无论包含窗口的大小是多少。

    这应该会有所帮助...

    private void MouseLeftButtonDown_Click(object sender, MouseButtonEventArgs e)
    {
        System.Windows.Point p = e.GetPosition(image);
        double pixelWidth = image.Source.Width;
        double pixelHeight = image.Source.Height;
        double x = pixelWidth * p.X / image.ActualWidth;
        double y = pixelHeight * p.Y / image.ActualHeight;
        MessageBox.Show(x + ", " + y);
    }
    

    我将您的图像重命名为“图像”以解决图像名称和类名称之间的冲突。按如下方式更新您的 XAML:

    <Image Name="image" MouseLeftButtonDown="MouseLeftButtonDown_Click" MouseRightButtonDown="MouseRightButtonDown_Click"></Image>
    

    pixelWidth 和 pixelHeight 是源图像的原始宽度和高度。 x和y是根据原始像素宽/高与屏幕上图像实际显示的宽/高的比值计算出来的。

    要在弹出消息中显示整个像素,请改用:

    MessageBox.Show((int)x + ", " + (int)y);
    

    @Gerret:请你举几个错误坐标的例子,以及你期望它们是什么?

    【讨论】:

    • 嗯,越来越好了。现在,如果将窗口拖动得更小,我也会得到相同的协调!但似乎计算是错误的。因为位置是错误的......它几乎是正确的,也许是从任何地方偏移?
    • 例如,如果我打开 1920x1080 图片并单击右下角,我会得到大约 2500x1400。如果我打开 3500x2747 并单击 右下角,我会得到大约 2774x1938。请在评论部分使用@gerret 发表评论,以便我收到通知,因为我没有意识到如果您在答案中添加它,您已经问过我一些问题!
    • 好吧,没关系,我从一开始就发现分辨率是错误的,所以这是另一个问题。我会在这里再问一次。感谢您的帮助,这对我帮助很大。
    • @Gerret,很高兴为您提供帮助。很抱歉之前无法添加评论;我的 StackOverflow 声誉不够高!现在是:)
    【解决方案2】:

    而不是null 尝试传递你的Image

    点赞System.Windows.Point p = e.GetPosition(Image);

    例如:

    你的形象:

    <Image x:Name="imgYouImage" /> 
    

    在您的代码中使用:

    Point p = e.GetPosition(imgYouImage);
    

    【讨论】:

    • 我不知道我是怎么做的,我必须添加一个 System.Windows.IInputElement 参数。
    • 你需要传递给你的图片名称而不是 null。
    • 所以你的意思是 class Image 或者你的意思是我的名为 image 的图片。如果我使用 class Image 会更好,但仍然不正确。如果我按左上角,我会得到正确的坐标,但如果我按右下角,我会得到一个太小的坐标......
    • 这不起作用!我也发不出来。我如何添加这个论点...你能进一步解释一下吗?
    • 然后在您的代码中使用 Point p = e.GetPosition(imgYouImage);
    【解决方案3】:

    试试:

    System.Windows.Point p = e.GetPosition(Image);
    

    按照 Simon Martin 的建议,我会解释这一点...

    GetPosition() 返回相对于作为参数传入的元素位置的鼠标点击位置。如果你传入null,这将是相对于窗口的位置,所以你需要传入你的图像名称以获得正确的坐标。

    请参阅我的其他答案以获得更好的解决方案。

    【讨论】:

    • 你能解释一下为什么你的答案有效,让它更有用
    猜你喜欢
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    相关资源
    最近更新 更多