当前位置: 首页 > 知识库问答 >
问题:

C#Wpf将鼠标坐标转换为缩放画布坐标

宇文勇
2023-03-14

我正在尝试将鼠标点击坐标转换为画布坐标。画布可以动态缩放。我实现了缩放功能,缩放转换整个画布。画布本身有一个图像作为窗口的背景。当用户使用鼠标滚轮时,背景会放大和缩小。如何转换鼠标点击坐标以反映图像上的缩放位置?

缩放地图图像代码:

    private void Canvas_MouseWheel(object sender, MouseWheelEventArgs e)
    {
       double zoom = 1.1;

        scaleTransform.CenterX = this.Width / 2;
        scaleTransform.CenterY = this.Height / 2;

        if (e.Delta > 0)
        {
            scaleTransform.ScaleX *= zoom;
            scaleTransform.ScaleY *= zoom;
        }
        else
        {
            scaleTransform.ScaleX /= zoom;
            scaleTransform.ScaleY /= zoom;
        }

        // Zoom out limits
        if(scaleTransform.ScaleX <= 1) { scaleTransform.ScaleX = 1; }
        if(scaleTransform.ScaleY <= 1) { scaleTransform.ScaleY = 1; }

        // Zoom in limits
        if(scaleTransform.ScaleX >= 2.4) { scaleTransform.ScaleX = 2.4; }
        if(scaleTransform.ScaleY >= 2.4) { scaleTransform.ScaleY = 2.4; }

    }

将图标添加到地图图像:

    private void mapImage_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {

        var v = e.GetPosition(this);

        var temp = GetImage("Assets/icon.png");

        Canvas.SetLeft(temp, v.X);
        Canvas.SetTop(temp, v.Y);

        temp.Width = 32;
        temp.Height = 32;
        temp.RenderTransform = new ScaleTransform(0.5, 0.5, temp.Width / 2, temp.Height / 2);
        mainCanvas.Children.Add(temp);

    }

我基本上是想用鼠标左键在地图上添加一个新的图标图像。但是,如果在我尝试添加图标时放大了地图,则图像的位置与单击的地图位置不相关。它会转到离鼠标光标很远的地方。如何根据地图图像的比例转换坐标?

注意:如果我根本不放大(图像的比例为1),那么图标将精确放置在我单击的位置。

共有2个答案

郦祯
2023-03-14

最简单的方法是获取原始图像大小,然后查看WPF图像控件(或您正在使用的任何其他控件)的实际宽度,并获取它们之间的比例

var eventLocation = e.GetPosition(MainImage);
var scaleRatio = SourceBitmap.Width / YourWpfImageControlName.ActualWidth;
var realX = eventLocation.X * scaleRatio;
var realY = eventLocation.Y * scaleRatio;

这假设您使用统一缩放(例如,保持纵横比),但您可以通过对高度进行相同的计算并将其应用于Y值,独立地对X轴和Y轴进行相同的比率计算

澹台展鹏
2023-03-14

我猜参数“this”到e。GetPotion方法造成了麻烦。您需要从Canvas但不是从Window获取相对位置。参数应该是Canvas“main Canvas”。所以,后一种方法如下所示:

private void mainCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
  var v = e.GetPosition(mainCanvas);

  var temp = new Image
  {
    Source = new BitmapImage(new Uri("Assets/icon.png", UriKind.Relative)),
    Width = 32,
    Height = 32
  };

  Canvas.SetLeft(temp, v.X - temp.Width / 2);
  Canvas.SetTop(temp, v.Y - temp.Height / 2);

  mainCanvas.Children.Add(temp);
}
 类似资料:
  • 我们体验一下Events类吧!为了使其尽量简单,我们使用Events类的getMousePos()获取鼠标光标的坐标,并在画布的左上角显示出来。getMousePos()方法返回相对于画布的坐标,它会考虑画布相对于页面的偏移,以及页面的滚动位置。 图6-1 画布坐标系 操作步骤 按照以下步骤,在每次鼠标移动时,获取画布上的鼠标坐标,并在画布的左上角显示出来: 1. 链接到Events类: <sc

  • 我正在尝试将球坐标转换为笛卡尔坐标,以绘制一个简单的三维金字塔。 下面是获取金字塔四个主要角的代码,具体取决于极角yrad和方位角xrad以及顶点坐标x和y: 方位角轴似乎工作正常,但问题是,在操纵极轴角时,当它们越过天顶或底部时,左右会互换,如图所示(选择顶部的mp4以更平滑地播放):http://gyazo.com/4a245713c232893960863cf4ea4186f6 怎么了?

  • 我试图将图像从极坐标转换为笛卡尔坐标,但在应用公式后,我得到了浮点坐标(r和teta),我不知道如何使用x和y的浮点来表示空间中的点。可能有一种方法可以将它们转换为整数,并仍然保留分布,但我不知道如何。我知道OpenCV中有像warpPolar这样的函数,但我想自己实现它。任何想法都会有帮助:) 这是我的代码:

  • 功能介绍 坐标转换(Convert)是从一种坐标系统变换到另一种坐标系统的过程,可以通过建立两个坐标系统之间一一对应的关系来实现,是各种比例尺地图测量和编绘中建立地图数学基础必不可少的步骤。坐标转换服务实现了四维高德坐标、百度坐标、搜狗等坐标之间相互转换的功能。 注:该服务不支持将偏移GPS坐标(如:百度坐标、高德坐标等)转换为未偏移GPS坐标。 适用场景 按需实现现有坐标系到需求坐标系之间的转换

  • 实现四维高德坐标、百度坐标、搜狗等坐标之间的转换。注意:不支持将偏移GPS坐标(如:百度坐标、高德坐标等)转换为未偏移GPS坐标。 使用服务前需要先申请 key。 资源服务地址:https://www.supermapol.com/iserver/services/coordconvert/rest/coordinate/convert 资源接口参数说明 坐标转换服务服务支持GET和HEAD请求,

  • 我正在使用PDFBox的在Java中显示PDF页面。我正试图基于页面中的(即AcroForm字段)在PDF页面的图像上创建可点击的区域。问题是PDF似乎使用了一个完全不同的坐标系: 收益率 如果我要估计图像上字段矩形的实际尺寸,它将是40,40,50,10(x,y,宽度,高度)。这两者之间没有明显的相关性,我似乎找不到任何关于这一点的信息与谷歌。 如何确定PDPage的cosobects的像素位置