Silverlight的3 - ScaleTransform或其他方法来在Canvas放大?(S

2019-06-23 22:23发布

我需要能够放大和缩小使用鼠标滚轮画布的。 我已经成功地建立了鼠标滚轮的处理程序,我目前使用ScaleTransform应用缩放; 然而,缩放不是一种“直观”的方式完成的。

我试图做到“缩放”,你可以在MultiScaleImage看到同样风格的,谷歌地图/地球或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

但是,问题仍然出现,它是缩小的左上角的,而不是像谷歌地图在变焦为“绕”鼠标点。

Answer 1:

你需要使用一个加权平均值作为基于鼠标位置缩放中心。 换句话说,保持最新的变焦中心(或者,如果你没有一个还只是将其设置为当前鼠标的位置),并保持的变焦中心计算出的次数(第变焦后,这将是1) 。 每次重新计算缩放中心的时间比,增加与变种。

示例代码如下: - 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有时会导致怪异的震动)。



文章来源: Silverlight 3 - ScaleTransform or other method to zoom in a Canvas?