如何在WPF中实现这个简单的功能(在Winforms中简单)? 图像以Stretch =“Uniform”显示。单击图像后,将保存坐标(相对于源图像),并在图像上显示点击点(小矩形)。
在winforms中,我通过查找PictureBox中的源图像的缩放和偏移来实现它,并且轻松转换了图像坐标。 接下来就是在winforms中我使用了GetGraphics()函数,因此标记不是持久性的,并且可以在每次调整大小时从已保存的标记重绘,WPF中添加的矩形会保留在它们的位置。
最好的方法是什么?或者在WPF窗口中使用WinForm控件是否更好?
编辑: 扩展计算 - 从Winforms复制并更新
private void ComputeScale ()
{
if (image1.Source == null)
{
this.imageScale = 1;
this.offsetX = 0;
this.offsetY = 0;
return;
}
//todo: picture has to be bigger than PictureBox
decimal imW = (decimal)image1.Source.Width;
decimal imH = (decimal)image1.Source.Height;
decimal pbW = (decimal)image1.ActualWidth;
decimal pbH = (decimal)image1.ActualHeight;
decimal scaleX = pbW / imW;
decimal scaleY = pbH / imH;
decimal scale = Math.Min (scaleX, scaleY);
decimal offsetX = Math.Round ((pbW - Math.Round (imW * scale)) / 2);
decimal offsetY = Math.Round ((pbH - Math.Round (imH * scale)) / 2);
this.imageScale = scale;
this.offsetX = (int)offsetX;
this.offsetY = (int)offsetY;
}
绘制矩形
Point p = e.GetPosition(image1);
decimal x = ((decimal)(p.X - offsetX)) / imageScale;
decimal y = ((decimal)(p.Y - offsetY)) / imageScale;
System.Drawing.Point ClickedSample = new System.Drawing.Point((int)Math.Round(x), (int)Math.Round(y));
Samples.Add(ClickedSample);
//PaintSampleMark
Rectangle r = new Rectangle();
r.StrokeThickness=1;
r.Stroke= Brushes.Blue;
r.Width = sampleRadius*2;
r.Height= sampleRadius*2;
r.Margin = new Thickness ((double)(offsetX - sampleRadius + x), (double)(offsetY - sampleRadius + y), 0, 0);
canvas1.Children.Add(r);