一次开发过程中遇到一个需求,需要以鼠标为中心点,利用鼠标滚轮对图片进行缩放。网上的资源还是很多的:
参考了如下一篇文档的缩放算法:尊重作者原创,附原文地址:
https://www.cnblogs.com/kongxianghai/archive/2012/06/26/2562966.html
给这篇blog点赞,实现的效果不错!

        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));//获取目标在缩放之后的RectRect 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;}}

实际在项目运用中用此方法碰见了2个问题:
问题1:缩放时放大的元素脱离了布局,缩放超过了父容器的限制,遮挡了界面中其他的布局,此问题多半是布局造成的bug,调整先后顺序可以解决此问题,

问题2:
//获取鼠标在缩放之后的目标上的位置
Point targetZoomFocus2 = new Point(targetZoomFocus1.X * (1 + d * .2), targetZoomFocus1.Y * (1 + d * .2));
bug发现 targetZoomFocus2 的x,y 坐标永远是(0,0)
解决此问题的办法是:

 _scaleValue += d * .2;Point targetZoomFocus1 = e.GetPosition(this);//ScaleTransform scaler = new ScaleTransform(_scaleValue,_scaleValue,0,0);Matrix mt = translater.Value;mt.M11 = _scaleValue;mt.M22 = _scaleValue;this.RenderTransform.Matrix = mt;

bug出现前的代码为:

  _scaleValue += d * .2;Point targetZoomFocus1 = e.GetPosition(this);ScaleTransform scaler = new ScaleTransform(_scaleValue,_scaleValue,0,0);**this.RenderTransform.Matrix = scaler.Value;**Point targetZoomFocus2 = new Point(targetZoomFocus1.X * (1 + d * .2), targetZoomFocus1.Y * (1 + d * .2));//Point pt=  (this.Parent as Canvas).TransformToAncestor(App.Current.MainWindow).Transform(new Point(0, 0));Rect afterScaleRect = this.RenderTransform.TransformBounds(new Rect(this.RenderSize));

即在缩放前需要对平移变化也要赋值,具体问题本质还不是特别清楚,但问题经过调试,通过对代码改进解决了缩放的问题。记录于此,供日后参阅方便!

WPF 鼠标滚轮对图片的缩放相关推荐

  1. 鼠标滚轮实现图片的缩放-------Day79

    今天是7月的最后一天了,不得不说,我定下的七月份剩余几天的计划是完不成了,一则工作确实紧了些,再则没能处理好生活.工作和学习的节奏,这才是人生最大的课题吧,不过也还好,至少自己还在坚持着,其实真的越来 ...

  2. PyQT5 实现滑动鼠标滚轮进行图片的缩放

     ImageBox是图像绘制类,主要进行图像绘制. # -*- coding: utf-8 -*-import sys from PyQt5 import QtCore, QtGui, QtWidge ...

  3. 鼠标滚轮控制图片的放大和缩小

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. jquery 鼠标滚轮实现图片缩放

    方法一:(不支持火狐) <span style="font-size:14px;"><span style="font-size:14px;" ...

  5. unity 如何使用鼠标滚轮进行物体的缩放

    当我们进行鼠标滚轮进行滑动时,会返回一个float的值, 当鼠标滚轮向前进行滑动时 返回的float值是>0的,        当鼠标滚轮向后进行滑动时 返回的float值是<0的   所 ...

  6. Cesium 鼠标滚轮事件获取地图缩放等级

    const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); //监听鼠标滚轮事件handler.setInputA ...

  7. java mousewheel_鼠标滚轮实现窗体图形缩放MouseWheel

    功能描述:在鼠标进入一个用于绘制图形的窗体(如:Show_3D)时,滚动鼠标滚轮,使窗体中的内容能够进行放大缩小.此处以绘制XNA图形为例. 滚动鼠标的滚轮,触发的是窗体或控件上的 MouseWhee ...

  8. boostrap 鼠标滚轮滑动图片_16种基于Bootstrap的css3图片hover效果

    bootstrap-image-hover是一款基于Bootstrap的css3图片hover效果.这组图片hover效果共16种特效.同时该特效也支持非Bootstrap版本. 使用方法 在页面中引 ...

  9. 【C#】C#实现鼠标滚轮的图像居中缩放

    [fishing-pan:https://blog.csdn.net/u013921430 转载请注明出处]   最近接触了一下C# 的内容,遇到一个需求,就是关于图像的的缩放.查找了网上的一些资源, ...

  10. boostrap 鼠标滚轮滑动图片_BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)...

    Bootstrap 轮播(Carousel)插件是一种灵活的响应式的向站点添加滑块的方式.除此之外,内容也是足够灵活的,可以是图像.内嵌框架.视频或者其他您想要放置的任何类型的内容. 因为最近开发的项 ...

最新文章

  1. BOJ 15 Panic Room
  2. 字典与文本文档的转换
  3. 16年国庆假期期间兼职所悟
  4. 无法连接NVIDIA驱动:NVIDIA-SMI has failed because it couldn’t communicate with the NVIDIA driver
  5. 全球人工智能人才培养与发展趋势
  6. AjaxPro怎么传对象参数
  7. 【预测模型】Leslie 人口增长模型
  8. 网易互联网,网易互娱 2021届校招内推开始啦
  9. 索尼笔记本E系列,关闭触摸板
  10. win7访问XP或者2003共享,提示密码错误的解决办法
  11. 三步搞定Origin双误差棒画法!
  12. linux 内核2.6.35.3,linux-2.6.35.3内核移植(s3c2440)
  13. 面向对象编程小项目,语音播报计算器
  14. Windows部分软件乱码教你快速解决
  15. 【mySQL】mySQL动态语句(SQL语句中有变量)
  16. 2021年茶艺师(高级)考试内容及茶艺师(高级)考试资料
  17. SiT3807:高性能单端压控振荡器VCXO
  18. C++ LinuxWebServer项目(5)同步异步日志系统
  19. 新中大软件SE+16.0操作手册账务和报表(也适合Gsoft和G3软件)
  20. datatable、dataset和datarow

热门文章

  1. 【高数】【本科笔记】【第七章 微分方程】【7.2 可分离变量的微分方程】
  2. 数据仓库架构以及多维数据模型的设计
  3. 自制Openerp图表
  4. 必过四级技巧方法总结大全
  5. linux查看硬盘插槽_SSD小讲堂丨自己动手丰衣足食 手把手教你安装M.2固态硬盘
  6. [激光原理与应用-61]:激光器 - 种子源 - 1064nm皮秒种子源参数解读
  7. 激光清洗铝合金氧化层的优势
  8. 苹果手机的计算机怎么设置快捷键大全,教程方法;苹果电脑快捷键大全最常用的都在这里了电脑技巧-琪琪词资源网...
  9. 2021-11-25【数据结构/严蔚敏】【Dijkstra】【代码实现算法7.15】
  10. hardware用u盘起动_u盘启动dos最简单的的小方法