Silverlight 3 - ScaleTransform 或其他放大 Canvas 的方法?

标签 silverlight controls canvas zooming

我需要能够使用鼠标滚轮放大和缩小 Canvas 。我已成功设置鼠标滚轮处理程序,目前正在使用 ScaleTransform 应用缩放;但是,缩放不是以“直观”的方式完成的。

我正在尝试实现与您在 MultiScaleImage、Google Maps/Earth 或 Adob​​e 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

然而,问题仍然存在,它正在缩小左上角,而不是像谷歌地图这样的网站,缩放是“围绕”鼠标。

最佳答案

您需要根据鼠标位置使用加权平均值作为缩放中心。换句话说,保持最新的缩放中心(或者如果你还没有,只需将其设置为当前鼠标位置)并保持计算缩放中心的次数(在第一次缩放之后,这将是 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 或其他放大 Canvas 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1030367/

相关文章:

c# - 将 silverlight 类库更改为 wpf 类库

vb.net - 在运行时更改控件的父级 VB.NET

Jquery 通配符

javascript - 在 Canvas 中旋转多个文本

c# - Silverlight 4 + RIA 服务负载

C#/Silverlight/WPF/快速渲染大量圆圈

javascript - Hook Canvas 的 toDataURL

python - tkinter 中的鼠标滚轮 + 滚动条出现问题

silverlight - 是否有任何有用的 Silverlight 框架?

javascript - ASP.NET AJAX UpdatePanel 的最佳替代解决方案