Silverlight 3 - ScaleTransform or other method to zoom in a Canvas?

前端 未结 1 1757
遇见更好的自我
遇见更好的自我 2020-12-23 18:12

I need to be able to zoom in and out of a Canvas using the mousewheel. I have successfully set up the mouse wheel handlers and am currently using a ScaleTransform to apply

相关标签:
1条回答
  • 2020-12-23 18:47

    You need to use a weighted average as the zoom center based on the mouse position. In other words, keep the latest zoom center (or if you don't have one yet just set it to the current mouse position) and keep the number of times the zoom center was calculated (after the first zoom, that would be 1). Than each time you recalculate the zoom center, increment that var.

    Example Code Follows - deltaZoom is how much you're zooming, centerX and centerY are the current zoom center, ZoomSteps is the number of times we've zoomed, and mouseX and mouseY are the current mouse position:

    _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();
    

    Edited so that you can drop below 1.0 zoom level but there are still some problems (ZoomStep = -1, 0 or 1 sometimes cause weird shakes).

    0 讨论(0)
提交回复
热议问题