문제

Mousewheel을 사용하여 캔버스를 확대 할 수 있어야합니다. 마우스 휠 핸들러를 성공적으로 설정했으며 현재 줌을 적용하기 위해 ScaleTransform을 사용하고 있습니다. 그러나 스케일링은 "직관적 인"방식으로 수행되지 않습니다.

MultiscaleImage, Google지도/지구 또는 Adobe Acrobat Reader에서 볼 수있는 것과 동일한 스타일의 "확대/축소"를 달성하려고하지만 이미지는 제어 기능이 없습니다. 전환은 "매끄러운"또는 애니메이션 일 필요는 없지만 (더 쉬운 접근이 아니라면) 기능은 동일해야합니다.

모든 생각이나 아이디어가 크게 높이 평가되며 미리 감사드립니다!

편집 : 애니메이션을 사용하여 줌을 "매끄럽게"했습니다.

<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>

다음 코드로 :

_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

그러나 Zoom이 마우스 주변에있는 Google지도와 같은 사이트와 달리 왼쪽 상단 코너에서 확대되는 문제는 여전히 발생합니다.

도움이 되었습니까?

해결책

마우스 위치에 따라 가중 평균을 줌 센터로 사용해야합니다. 다시 말해, 최신 줌 센터를 유지하고 (또는 아직 현재 마우스 위치로 설정하지 않은 경우) 줌 센터가 계산 된 횟수를 유지하십시오 (첫 번째 줌 후에는 1). . Zoom Center를 다시 계산할 때보 다 Var를 증가시킵니다.

예제 코드 다음의 예 - Deltazoom은 확대하는 금액, CenterX 및 Centery는 현재 줌 센터, Zoomsteps는 우리가 확대 한 횟수이며 Mousex와 Mousey는 현재 마우스 위치입니다.

_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은 때때로 이상한 흔들림을 유발합니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top