2009-11-05 1 views
6

내가 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); 
} 
+0

개인적으로 나는 당신의 "not-so-short-and-sweet"해결책에 개인적으로 정확히 할 것입니다. 나는이 일을 할 수있는 빌트인 도서관에 입후보하지 않았다. –

답변

7

그것은 아마 쉬울 것이다. 예를 들면 다음과 같습니다.

<Viewbox Stretch="{Binding ImageStretch}"> 
    <Image Name="imageCtrl" Source="{Binding MyImage}" Stretch="None"/> 
</Viewbox> 

GetPosition (..)을 호출하면 WPF가 자동으로 배율을 계산합니다.

void imageCtrl_MouseMove(object sender, MouseEventArgs e) 
{ 
    Point locationInControl = e.GetPosition(imageCtrl); 
} 
+0

감사합니다. HorizontalAlignment를 설정할 필요가 없다는 것을 알았지 만 이미지 소스의 DPI를 96으로 설정하는 것이 중요했습니다 (비표준 비트 맵을 사용하고있었습니다). 아, 그리고'Viewbox'의 'b'는 소문자입니다 :) – Gabriel

+0

놀라운! WPF에서 얼마나 쉽게 할 수 있는지 정말 멋집니다! 감사합니다. 시간을 절약했습니다. – Fedor