一次开发过程中遇到一个需求,需要以鼠标为中心点,利用鼠标滚轮对图片进行缩放。网上的资源还是很多的:
参考了如下一篇文档的缩放算法:尊重作者原创,附原文地址:
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. xUtils简介及其使用方法
  2. Servlet学习DAY_01:服务器概念/Web服务器的作用/ Servlet概念/ 如何关联和解除Tomcat/ 创建一个Web工程 /Servlet响应流程/ Get-Post /常见异常
  3. ubuntu20.0.4如何更新软件源?快速更新阿里源步骤具体实现
  4. 实战3--设计管理模块,整合!!!
  5. 衔接上一学期:排球积分规则
  6. ubuntu16.04 安装 ipython
  7. JavaScript---函数
  8. 今日头条10.82亿元拿下 “中国最牛街道”土地:将与腾讯、阿里做邻居
  9. spark学习-Spark Streaming初次理解
  10. Python抽象类(abc模块)
  11. PIX飞控中POS数据读取方法(实用工具)
  12. oracle 伪列访问序列,Oracle同义词与序列基础教程
  13. Nginx之——负载均衡、限流、缓存、黑名单和灰度发布
  14. java程序实现删除本地文件
  15. 联想小新pad安装Google Play教程
  16. 智学网登录不了java_智学网常见问题解决方法介绍
  17. UnityC#接阿里云头像自动分割API
  18. Duplicate column name错误办法
  19. 逆向完整还原触摸精灵2.X版本工程代码
  20. centos7系统root分区扩容

热门文章

  1. ElasticSearch分词器IK安装教程
  2. dataV实现扇形图轮播
  3. dlna 服务器 性能,dlna 使用体验,供大家参考,欢迎交流
  4. 7.2 可分离变量的微分方程
  5. 干净的国内系统镜像源
  6. c语言乘方程序,C语言求幂计算的高效解法
  7. mysql数据库常用名词_【千寻】MySQL数据库名词注释(持续更新)
  8. unity shader 溶解,上下左右,cutoff
  9. 小柯在学JAVA之第一弹
  10. 置换的玩笑——DFS暴力