一、缩放要求

  1. 缩放对象在可视区域内,已对象的中心点进行缩放。
  2. 缩放对象比可视区大,并且对象各边界都在可视区外围,那么已鼠标位置进行缩放。
  3. 缩放对象比可视区大,但是缩放后某一边界在可视区的对应边界内,那么该边界与可视区边界对齐,对向缩放。

二、代码片段

private void Window_MouseWheel(object sender, MouseWheelEventArgs e) { if (e.Delta == 0) return; double d = e.Delta / Math.Abs(e.Delta); if (_scaleValue < 0.5 && d < 0) return; if (_scaleValue > 20 && d > 0) return; _scaleValue += d * .2; //获取鼠标在缩放之前的目标上的位置 Point targetZoomFocus1 = e.GetPosition(target); //获取目标在缩放之前的Rect Rect beforeScaleRect = target.RenderTransform.TransformBounds(new Rect(target.RenderSize)); //缩放的中心点为左上角(0,0) scaler.ScaleX = _scaleValue; scaler.ScaleY = _scaleValue; //获取鼠标在缩放之后的目标上的位置 Point targetZoomFocus2 = new Point(targetZoomFocus1.X * (1 + d * .2), targetZoomFocus1.Y * (1 + d * .2)); //获取目标在缩放之后的Rect Rect afterScaleRect = target.RenderTransform.TransformBounds(new Rect(target.RenderSize)); //算的缩放前后鼠标的位置间的差 Vector v = targetZoomFocus2 - targetZoomFocus1; if (afterScaleRect.Size.Width <= _viewportSize.Width) { //缩放之后居中 double widthHalfDelta = (Container.RenderSize.Width - afterScaleRect.Width) / 2; translater.X = widthHalfDelta; } else if (afterScaleRect.X - v.X > 0) { //目标左边界与可视左边界对齐 translater.X = 0; } else if (afterScaleRect.X + afterScaleRect.Width - v.X < Container.RenderSize.Width) { //目标右边界与可视右边界对齐 translater.X = Container.RenderSize.Width - afterScaleRect.Size.Width; } else { //减去鼠标点在缩放前后之间的差值,实际上就是以鼠标点为中心进行缩放 translater.X -= v.X; } if (afterScaleRect.Size.Height <= _viewportSize.Height) { double heightHalfDleta = (Container.RenderSize.Height - afterScaleRect.Height) / 2; translater.Y = heightHalfDleta; } else if (afterScaleRect.Y - v.Y > 0) { translater.Y = 0; } else if (afterScaleRect.Y + afterScaleRect.Height - v.Y < Container.RenderSize.Height) { translater.Y = Container.RenderSize.Height - afterScaleRect.Size.Height; } else { translater.Y -= v.Y; } }

源代码

此处内容需要评论回复后(审核通过)方可阅读。

END
本文作者:
文章标题:c#,利用WPF的ScaleTransform和TranslateTransform实现图片的缩放效果
本文地址:https://blog.snwl0311.cn/index.php/archives/305/
版权说明:若无注明,本文皆薄·客原创,转载请保留文章出处。
Last modification:June 13, 2022
有钱的给钱,没钱的点赞哦,感谢哥哥姐姐厚爱!