Как реализовать эту простую функциональность (простую в Winforms) в WPF?Изображение отображается с помощью Stretch = "Uniform".После нажатия на изображение координаты (относительно исходного изображения) сохраняются, и точка щелчка отображается (маленький прямоугольник) над изображением.
В winforms я сделал это, найдя масштаб и смещение исходного изображения в PictureBox, а затем легко преобразовал координаты изображения.Далее в winforms я использовал функцию GetGraphics (), чтобы пометки не были постоянными и могли быть перерисованы из сохраненных при каждом изменении размера, прямоугольники, добавленные в WPF, остаются на своих местах.
Что лучшеспособ сделать это?Или лучше использовать элемент управления WinForm в окне WPF?
Редактировать: Масштабирование - скопировано из 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);