首页 文章

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

提问于
浏览
0

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

缩放 Map 图像代码:

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; }

    }

在 Map 图片中添加图标:

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);

    }

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

注意:如果我根本不放大(图像的比例为1),那么图标就会完全放在我点击的位置 .

1 回答

  • 0

    我猜e.GetPosition方法的参数“this”会造成麻烦 . 您需要从Canvas获取相对位置,而不是从Window获取 . 参数应该是Canvas“mainCanvas” . 所以,后一种方法就像:

    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);
    }
    

相关问题