Silverlight 3 - ScaleTransform或其他放大画布的方法?
-
06-07-2019 - |
题
我需要能够使用鼠标滚轮放大和缩小画布。我已经成功设置了鼠标滚轮处理程序,目前正在使用ScaleTransform来应用缩放;然而,缩放不是以“直观”的方式完成的。办法。
我正在努力实现相同的“缩放”风格。正如您在MultiScaleImage,Google Maps / Earth或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
然而,问题仍然出现在它从左上角缩小,而不是像谷歌地图这样的缩放是“周围”的网站。老鼠。
解决方案
您需要根据鼠标位置使用加权平均值作为缩放中心。换句话说,保留最新的变焦中心(或者如果你还没有将变焦中心设置为当前鼠标位置)并保持变焦中心的计算次数(在第一次变焦后,即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有时会导致奇怪的抖动)。
不隶属于 StackOverflow