WPF 鼠标滚轮对图片的缩放
一次开发过程中遇到一个需求,需要以鼠标为中心点,利用鼠标滚轮对图片进行缩放。网上的资源还是很多的:
参考了如下一篇文档的缩放算法:尊重作者原创,附原文地址:
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 鼠标滚轮对图片的缩放相关推荐
- 鼠标滚轮实现图片的缩放-------Day79
今天是7月的最后一天了,不得不说,我定下的七月份剩余几天的计划是完不成了,一则工作确实紧了些,再则没能处理好生活.工作和学习的节奏,这才是人生最大的课题吧,不过也还好,至少自己还在坚持着,其实真的越来 ...
- PyQT5 实现滑动鼠标滚轮进行图片的缩放
ImageBox是图像绘制类,主要进行图像绘制. # -*- coding: utf-8 -*-import sys from PyQt5 import QtCore, QtGui, QtWidge ...
- 鼠标滚轮控制图片的放大和缩小
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- jquery 鼠标滚轮实现图片缩放
方法一:(不支持火狐) <span style="font-size:14px;"><span style="font-size:14px;" ...
- unity 如何使用鼠标滚轮进行物体的缩放
当我们进行鼠标滚轮进行滑动时,会返回一个float的值, 当鼠标滚轮向前进行滑动时 返回的float值是>0的, 当鼠标滚轮向后进行滑动时 返回的float值是<0的 所 ...
- Cesium 鼠标滚轮事件获取地图缩放等级
const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); //监听鼠标滚轮事件handler.setInputA ...
- java mousewheel_鼠标滚轮实现窗体图形缩放MouseWheel
功能描述:在鼠标进入一个用于绘制图形的窗体(如:Show_3D)时,滚动鼠标滚轮,使窗体中的内容能够进行放大缩小.此处以绘制XNA图形为例. 滚动鼠标的滚轮,触发的是窗体或控件上的 MouseWhee ...
- boostrap 鼠标滚轮滑动图片_16种基于Bootstrap的css3图片hover效果
bootstrap-image-hover是一款基于Bootstrap的css3图片hover效果.这组图片hover效果共16种特效.同时该特效也支持非Bootstrap版本. 使用方法 在页面中引 ...
- 【C#】C#实现鼠标滚轮的图像居中缩放
[fishing-pan:https://blog.csdn.net/u013921430 转载请注明出处] 最近接触了一下C# 的内容,遇到一个需求,就是关于图像的的缩放.查找了网上的一些资源, ...
- boostrap 鼠标滚轮滑动图片_BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)...
Bootstrap 轮播(Carousel)插件是一种灵活的响应式的向站点添加滑块的方式.除此之外,内容也是足够灵活的,可以是图像.内嵌框架.视频或者其他您想要放置的任何类型的内容. 因为最近开发的项 ...
最新文章
- BOJ 15 Panic Room
- 字典与文本文档的转换
- 16年国庆假期期间兼职所悟
- 无法连接NVIDIA驱动:NVIDIA-SMI has failed because it couldn’t communicate with the NVIDIA driver
- 全球人工智能人才培养与发展趋势
- AjaxPro怎么传对象参数
- 【预测模型】Leslie 人口增长模型
- 网易互联网,网易互娱 2021届校招内推开始啦
- 索尼笔记本E系列,关闭触摸板
- win7访问XP或者2003共享,提示密码错误的解决办法
- 三步搞定Origin双误差棒画法!
- linux 内核2.6.35.3,linux-2.6.35.3内核移植(s3c2440)
- 面向对象编程小项目,语音播报计算器
- Windows部分软件乱码教你快速解决
- 【mySQL】mySQL动态语句(SQL语句中有变量)
- 2021年茶艺师(高级)考试内容及茶艺师(高级)考试资料
- SiT3807:高性能单端压控振荡器VCXO
- C++ LinuxWebServer项目(5)同步异步日志系统
- 新中大软件SE+16.0操作手册账务和报表(也适合Gsoft和G3软件)
- datatable、dataset和datarow
热门文章
- 【高数】【本科笔记】【第七章 微分方程】【7.2 可分离变量的微分方程】
- 数据仓库架构以及多维数据模型的设计
- 自制Openerp图表
- 必过四级技巧方法总结大全
- linux查看硬盘插槽_SSD小讲堂丨自己动手丰衣足食 手把手教你安装M.2固态硬盘
- [激光原理与应用-61]:激光器 - 种子源 - 1064nm皮秒种子源参数解读
- 激光清洗铝合金氧化层的优势
- 苹果手机的计算机怎么设置快捷键大全,教程方法;苹果电脑快捷键大全最常用的都在这里了电脑技巧-琪琪词资源网...
- 2021-11-25【数据结构/严蔚敏】【Dijkstra】【代码实现算法7.15】
- hardware用u盘起动_u盘启动dos最简单的的小方法