Próbuję dowiedzieć się WPF, więc tutaj jest to proste pytanie, mam nadzieję:Transformacja współrzędnych z kontrolą obrazu do źródła obrazu w WPF
Mam okno, które zawiera element obrazu związanego z oddzielnym danych Obiekt o konfigurowalne Stretch
nieruchomość
<Image Name="imageCtrl" Source="{Binding MyImage}" Stretch="{Binding ImageStretch}" />
gdy użytkownik przesuwa kursor myszy nad obrazem, chciałbym, aby określić współrzędne myszy w stosunku do oryginalnego obrazu na (przed rozciąganiem/przycinania, która występuje, gdy jest wyświetlany w kontrolce), a następnie zrobić coś za pomocą t współrzędne węża (zaktualizuj obraz).
wiem, że można dodać obsługi zdarzeń do zdarzenia mouseMove nad kontrolą obrazu, ale nie jestem pewien, w jaki sposób najlepiej przekształcić współrzędne:
void imageCtrl_MouseMove(object sender, MouseEventArgs e)
{
Point locationInControl = e.GetPosition(imageCtrl);
Point locationInImage = ???
updateImage(locationInImage);
}
Teraz wiem, mogłem porównać rozmiar z Source
do ActualSize
kontrolki, a następnie włącz imageCtrl.Stretch
, aby obliczyć skalary i przesunięcia w X i Y, i sam dokonaj transformacji. Ale WPF ma już wszystkie informacje i wygląda na to, że funkcjonalność może być wbudowana w biblioteki WPF gdzieś. Zastanawiam się: czy istnieje krótkie i słodkie rozwiązanie? Czy muszę sam to napisać?
EDIT jestem dołączanie mój obecny, nie tak krótki i słodki rozwiązanie. Nie jest tak źle, ale byłbym nieco zaskoczony, jeśli WPF nie przewiduje tej funkcji automatycznie:
Point ImgControlCoordsToPixelCoords(Point locInCtrl,
double imgCtrlActualWidth, double imgCtrlActualHeight)
{
if (ImageStretch == Stretch.None)
return locInCtrl;
Size renderSize = new Size(imgCtrlActualWidth, imgCtrlActualHeight);
Size sourceSize = bitmap.Size;
double xZoom = renderSize.Width/sourceSize.Width;
double yZoom = renderSize.Height/sourceSize.Height;
if (ImageStretch == Stretch.Fill)
return new Point(locInCtrl.X/xZoom, locInCtrl.Y/yZoom);
double zoom;
if (ImageStretch == Stretch.Uniform)
zoom = Math.Min(xZoom, yZoom);
else // (imageCtrl.Stretch == Stretch.UniformToFill)
zoom = Math.Max(xZoom, yZoom);
return new Point(locInCtrl.X/zoom, locInCtrl.Y/zoom);
}
Osobiście prawdopodobnie zrobiłbym to dokładnie tak, jak masz w swoim "nie tak krótkim i słodkim" rozwiązaniu. Nie wpadłem na wbudowaną bibliotekę, która by to zrobiła. –