2009-06-23 2 views
11

마우스 휠을 사용하여 캔버스를 확대 및 축소 할 수 있어야합니다. 마우스 휠 핸들러를 성공적으로 설정했으며 현재 ScaleTransform을 사용하여 줌을 적용하고 있습니다. 그러나 스케일링은 "직관적 인"방식으로 수행되지 않습니다.Silverlight 3 - ScaleTransform 또는 Canvas를 확대/축소하는 다른 방법?

저는 MultiScaleImage, Google Maps/Earth 또는 Adobe Acrobat Reader에서 볼 수있는 것과 같은 "확대/축소"스타일을 달성하려고합니다. 그러나 이미지가있는 것은 아닙니다. 전환은 "부드럽거나"움직일 필요가 없습니다 (쉬운 접근 방법이 아닌 한). 그러나 기능은 동일해야합니다.

어떤 생각이나 아이디어라도 감사 드리며 미리 감사드립니다.

편집 :

_Zoom += (args.Delta/7); 
if (_Zoom < 0.15) 
    _Zoom = 0.15; 
ZoomAnimationX.To = _Zoom; 
ZoomAnimationY.To = _Zoom; 
ZoomStoryboard.Begin(); 
ZoomScale.Text = _Zoom.ToString("0.00") + "x"; 
_PreviousMousePosition = _CurrentMousePosition 

그러나, 문제는 여전히 밖으로 확대되어 발생 : 다음 코드로

<Canvas.Resources> 
      <Storyboard x:Name="ZoomStoryboard"> 
       <DoubleAnimation x:Name="ZoomAnimationX" 
           Storyboard.TargetName="Workspace" 
           Storyboard.TargetProperty="Canvas.RenderTransform.ScaleTransform.ScaleX" 
           Duration="0:0:0.2"/> 
       <DoubleAnimation x:Name="ZoomAnimationY" 
           Storyboard.TargetName="Workspace" 
           Storyboard.TargetProperty="Canvas.RenderTransform.ScaleTransform.ScaleY" 
           Duration="0:0:0.2"/> 
      </Storyboard> 
     </Canvas.Resources> 

: 나는 "부드러운"줌 사용하여 애니메이션을 관리했습니다 왼쪽 위 모서리. 줌이 마우스 주변에있는 Google Maps와는 대조적입니다.

답변

10

마우스 위치에 따라 가중 평균을 줌 센터로 사용해야합니다. 즉, 최신 줌 센터를 유지하거나 (현재 마우스 위치로 설정하지 않은 경우) 줌 센터가 계산 된 횟수를 유지하십시오 (첫 번째 줌 이후에는 1이됩니다) . 확대/축소 센터를 다시 계산할 때마다 그 var를 증가시킵니다.

: ZoomSteps 우리는 확대 한 횟수입니다, deltaZoom이 centerX 및 centerY는 현재 줌 센터, 당신이 확대 얼마나 많은, 그리고 mouseX과 쥐색의 현재 마우스 위치입니다 -

예제 코드는 다음

_Zoom += deltaZoom; 
     if (_Zoom <= 0) 
      _Zoom = 0.1; 

     if (deltaZoom >= 0) 
     { 
      if (_ZoomSteps == -1) 
      { 
       _CenterX = 0; 
       _CenterY = 0; 
       _ZoomSteps = 0; 
      } 
      else 
      { 
       _CenterX = (_CenterX * Math.Abs(_ZoomSteps) + mouseX)/(Math.Abs(_ZoomSteps + 1)); 
       _CenterY = (_CenterY * Math.Abs(_ZoomSteps) + mouseY)/(Math.Abs(_ZoomSteps + 1)); 
       _ZoomSteps++; 
      } 
     } 
     else 
     { 
      if (_ZoomSteps == 1) 
      { 
       _CenterX = 0; 
       _CenterY = 0; 
       _ZoomSteps = 0; 
      } 
      else 
      { 
       _CenterX = (_CenterX * Math.Abs(_ZoomSteps) - mouseX)/(Math.Abs(_ZoomSteps - 1)); 
       _CenterY = (_CenterY * Math.Abs(_ZoomSteps) - mouseY)/(Math.Abs(_ZoomSteps - 1)); 
       _ZoomSteps--; 
      } 
     } 

     ZoomAnimationX.To = _Zoom; 
     ZoomAnimationY.To = _Zoom; 
     CenterAnimationX.To = Math.Abs(_CenterX); 
     CenterAnimationY.To = Math.Abs(_CenterY); 
     ZoomStoryboard.Begin(); 

편집자는 1.0 확대/축소 수준 이하로 떨어질 수 있지만 여전히 몇 가지 문제가 있음을 알 수 있습니다 (ZoomStep = -1, 0 또는 1은 때때로 이상한 떨림을 유발할 수 있음).

+0

감사합니다. 출처 : +1 –

+0

CenterAnimation이란 무엇입니까? – Erix