내가 WPF를 배우려고 노력하고있어에서 이미지 소스에 이미지 컨트롤에서 좌표, 그래서 여기에 간단한 질문, 나는 희망 :변형하기가 WPF
나는 별도의 데이터 바인딩 이미지 요소를 포함하는 창문이 발생 연신 전에 (사용자가 이미지 위에 마우스를 이동
<Image Name="imageCtrl" Source="{Binding MyImage}" Stretch="{Binding ImageStretch}" />
, 내가 원 화상에 대하여 마우스의 좌표를 확인하고 싶은 사용자 구성 Stretch
속성 객체/자르기 컨트롤에 표시됩니다), t 호스 좌표 (이미지 업데이트).
는 내가 이미지 컨트롤을 통해 MouseMove 이벤트에 이벤트 핸들러를 추가 할 수 알지만, 좌표 변환하는 방법을 가장 잘 모르겠어요 : 지금은 내가 크기를 비교할 수 알고
void imageCtrl_MouseMove(object sender, MouseEventArgs e)
{
Point locationInControl = e.GetPosition(imageCtrl);
Point locationInImage = ???
updateImage(locationInImage);
}
을 Source
을 컨트롤의 ActualSize
에 연결 한 다음 imageCtrl.Stretch
을 켜서 X와 Y의 스칼라와 오프셋을 계산하고 직접 변환하십시오. 그러나 WPF는 이미 모든 정보를 가지고 있으며 이것은 어딘가에 WPF 라이브러리에 내장 될 수있는 기능처럼 보입니다. 그래서 궁금하네요. 짧고 달콤한 해결책이 있습니까? 또는 직접 작성해야합니까?
편집 내 달콤한 - 그래서 - 단기 및 아닌, 현재의 솔루션을 추가하고있다. 그 나쁜하지만, WPF는 자동으로이 기능을 제공하지 않은 경우 나는 다소 놀라게 될 것 없습니다 : 당신이 뷰 박스를 사용하는 경우
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);
}
개인적으로 나는 당신의 "not-so-short-and-sweet"해결책에 개인적으로 정확히 할 것입니다. 나는이 일을 할 수있는 빌트인 도서관에 입후보하지 않았다. –