我正在尝试将鼠标单击坐标转换为画布坐标。 画布可以动态缩放。我实现了ScaleTransforms整个画布的缩放功能。画布本身有一个图像作为窗口的背景。当用户使用鼠标滚轮时,背景会放大和缩小。如何转换鼠标单击坐标以反映图像上的缩放位置?
缩放地图图片代码:
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),那么图标就会放在我点击的位置。
答案 0 :(得分:0)
我想参数&#34;这个&#34;以e.GetPosition方法制造麻烦。您需要从Canvas获取相对位置,而不是从Window获取。参数应该是Canvas&#34; mainCanvas&#34;。所以,后一种方法就像:
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);
}
答案 1 :(得分:0)
最简单的方法是获取原始图像大小,然后查看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轴进行相同的比例计算>