博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c#,利用WPF的ScaleTransform和TranslateTransform实现图片的缩放效果
阅读量:4699 次
发布时间:2019-06-09

本文共 2794 字,大约阅读时间需要 9 分钟。

一、缩放要求

1.缩放对象在可视区域内,已对象的中心点进行缩放。

2.缩放对象比可视区大,并且对象各边界都在可视区外围,那么已鼠标位置进行缩放。

3.缩放对象比可视区大,但是缩放后某一边界在可视区的对应边界内,那么该边界与可视区边界对齐,对向缩放。

 

 

二、缩放代买片段

1         private void Window_MouseWheel(object sender, MouseWheelEventArgs e) { 2             if (e.Delta == 0) return; 3  4  5             double d = e.Delta / Math.Abs(e.Delta); 6  7             if (_scaleValue < 0.5 && d < 0) return; 8  9             if (_scaleValue > 20 && d > 0) return;10 11             _scaleValue += d * .2;12 13             //获取鼠标在缩放之前的目标上的位置14             Point targetZoomFocus1 = e.GetPosition(target);15 16             //获取目标在缩放之前的Rect17             Rect beforeScaleRect =18                 target.RenderTransform.TransformBounds(new Rect(target.RenderSize));19 20             //缩放的中心点为左上角(0,0)21             scaler.ScaleX = _scaleValue;22             scaler.ScaleY = _scaleValue;23 24             //获取鼠标在缩放之后的目标上的位置25             Point targetZoomFocus2 = new Point(targetZoomFocus1.X * (1 + d * .2), targetZoomFocus1.Y * (1 + d * .2));26 27             //获取目标在缩放之后的Rect28             Rect afterScaleRect = target.RenderTransform.TransformBounds(new Rect(target.RenderSize));29 30             //算的缩放前后鼠标的位置间的差31             Vector v = targetZoomFocus2 - targetZoomFocus1;32                         33 34             if (afterScaleRect.Size.Width <= _viewportSize.Width) {35                 //缩放之后居中36                 double widthHalfDelta = (Container.RenderSize.Width - afterScaleRect.Width) / 2;37                 translater.X = widthHalfDelta;38             }39             else if (afterScaleRect.X - v.X > 0) {40                 //目标左边界与可视左边界对齐41                 translater.X = 0;42             }43             else if (afterScaleRect.X + afterScaleRect.Width - v.X < Container.RenderSize.Width) {44                 //目标右边界与可视右边界对齐45                 translater.X = Container.RenderSize.Width - afterScaleRect.Size.Width;46             }47             else {48                 //减去鼠标点在缩放前后之间的差值,实际上就是以鼠标点为中心进行缩放49                 translater.X -= v.X;50             }51 52 53             if (afterScaleRect.Size.Height <= _viewportSize.Height) {54                 double heightHalfDleta = (Container.RenderSize.Height - afterScaleRect.Height) / 2;55                 translater.Y = heightHalfDleta;56             }57             else if (afterScaleRect.Y - v.Y > 0) {58                 translater.Y = 0;59             }60             else if (afterScaleRect.Y + afterScaleRect.Height - v.Y < Container.RenderSize.Height) {61                 translater.Y = Container.RenderSize.Height - afterScaleRect.Size.Height;62             }63             else {64                 translater.Y -= v.Y;65             }66         }

 

代码:

http://download.csdn.net/download/kongxh_1981/9161521

转载于:https://www.cnblogs.com/Yjianyong/p/7182063.html

你可能感兴趣的文章
Apache 调用不同的 PHP 版本
查看>>
第三周总结
查看>>
流程控制与数组
查看>>
python循环导入的解决方案
查看>>
AngularJS中选择样式
查看>>
JDK的命令具体解释操作
查看>>
创建图书管理项目
查看>>
ie6 双边距问题
查看>>
Vue跨层级传递slot的方法
查看>>
暑假集训计划
查看>>
做个睿智的女人
查看>>
List遍历三种方法:1.for 2.增强性for 3.迭代器
查看>>
ArcGIS10.1发布WFS-T服务
查看>>
leetcode-汉明距离
查看>>
在Mac机器上给ITerm2配置lrzsz,便捷的传输文件到远程服务器上
查看>>
软工文档——系统、程序流程图、系统流图
查看>>
Hashtable的hashCode的使用以及toString的复写——《Thinking in Java》随笔024
查看>>
list remove object
查看>>
POJ3683 Priest John's Busiest Day
查看>>
linux基本命令(2) 修改文件所属人以及权限
查看>>