一、缩放要求

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

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

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

二、缩放代买片段

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

代码:

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

c#,利用WPF的ScaleTransform和TranslateTransform实现图片的缩放效果的更多相关文章

  1. 利用WPF绘图

    C#入门经典 25章的一个例子,利用WPF绘图. XAML: <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/p ...

  2. 利用WPF创建含多种交互特性的无边框窗体

    咳咳,标题一口气读下来确实有点累,让我先解释一下.另外文章底部有演示程序的下载. 本文介绍利用WPF创建一个含有以下特性的窗口: 有窗口阴影,比如QQ窗口外围只有几像素的阴影: 支持透明且无边框,为了 ...

  3. 利用WPF建立自己的3d gis软件(非axhost方式)(十二)SDK中的导航系统

    原文:利用WPF建立自己的3d gis软件(非axhost方式)(十二)SDK中的导航系统 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bPew ...

  4. 利用WPF建立自己的3d gis软件(非axhost方式)(十三)万能的用户层接口,(强大的WPF)

    原文:利用WPF建立自己的3d gis软件(非axhost方式)(十三)万能的用户层接口,(强大的WPF) 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt ...

  5. 利用WPF建立自己的3d gis软件(非axhost方式)(十一)SDK中的动画系统

    原文:利用WPF建立自己的3d gis软件(非axhost方式)(十一)SDK中的动画系统 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bPew ...

  6. 利用WPF建立自己的3d gis软件(非axhost方式)(十)SDK中一些自带的展示面板应用

    原文:利用WPF建立自己的3d gis软件(非axhost方式)(十)SDK中一些自带的展示面板应用 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV ...

  7. 利用WPF建立自己的3d gis软件(非axhost方式)(七)实现简单的粒子效果

    原文:利用WPF建立自己的3d gis软件(非axhost方式)(七)实现简单的粒子效果 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bPew密 ...

  8. 利用WPF建立自己的3d gis软件(非axhost方式)(八)拖动一个UI到地球上

    原文:利用WPF建立自己的3d gis软件(非axhost方式)(八)拖动一个UI到地球上 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bPew ...

  9. 利用WPF建立自己的3d gis软件(非axhost方式)(九)SDK自带部分面板的调用

    原文:利用WPF建立自己的3d gis软件(非axhost方式)(九)SDK自带部分面板的调用 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bP ...

随机推荐

  1. 使用django rest framework写POST和GET接口

    https://www.cnblogs.com/Jack-cx/p/9351633.html

  2. Java集合框架(Collection Framework)学习之 Collection与Map概貌

    写过Java的人都知道Java集合类,也用过Java集合类.Java集合类位于 java.util 这个包下,就像它的包名暗示的那样,Java集合类就是一套工具.它就像工匠的工具箱一样,它能给使用它的 ...

  3. Spring MVC 基本配制

    WEB.XML 文件中的配制: <?xml version="1.0" encoding="UTF-8"?> <web-app id=&quo ...

  4. 按照已有的模板打印小票<二> ——调用windows打印机打印 可设置字体样式

    按照已有的模板打印小票<二> ——调用windows打印机打印 可设置字体样式 之前写过一篇文章<按照已有的模板输出一(如发票)>,是关于如何给已有的模板赋值.在项目的实践过程 ...

  5. mvc - Authorize授权

    from : http://www.cnblogs.com/asks/p/4372783.html http://www.cnblogs.com/myindex/p/5479428.html

  6. 一行代码搞定Dubbo接口调用

    本文来自网易云社区 作者:吕彦峰 在工作中我们经常遇到关于接口测试的问题,无论是对于QA同学还是开发同学都会有远程接口调用的需求.针对这种问题我研发了一个工具包,专门用于远程Dubbo调用,下面就让我 ...

  7. OCP题库升级,iZ0-052新加的考题及答案整理-18

    18.You want to Install Oracle 11g database software and create a database on ASM Immediately after t ...

  8. react.js学习之路六

    学习react中,我一直认为,总组件里面才有构造函数,但是我才发现我的观点是错误的,构造函数是可以出现在子组件里面的. 今天有一个错误是点击增加/减少input框里面 的数值 我一直在寻找input框 ...

  9. [ActionScript 3.0] AS3实现3D旋转

    package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Display ...

  10. 使用私有git仓库备份服务器脚本和配置文件

    1. 创建私有git仓库 服务器端配置: # 安装 git yum -y install git # 创建 git 用户 useradd git # 创建私有仓库数据存储目录 mkdir /git_b ...