一、缩放要求

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 //获取目标在缩放之前的Rect
17 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 //获取目标在缩放之后的Rect
28 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

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. ubuntu 中安装 Redis

    1.下载安装root@21ebdf03a086:/# apt-cache search redisroot@21ebdf03a086:/# apt-get install redis-server a ...

  2. Webbench的使用

    Webbench是一个在linux下使用的非常简单的网站压测工具. 它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力 ...

  3. 《Think in Java》17~18

    chapter 17 容器深入研究 填充容器 package cn.test; import java.util.ArrayList; import java.util.Collections; im ...

  4. python字符串的切片

    # 字符串的切片 """ (5)字符串的切片 :切片就是截取字符串的意思 (1)语法 =>字符串[::] 完整格式:[开始索引:结束索引:间隔值 (2)[:结束索引 ...

  5. “全栈2019”Java第二十一章:流程控制语句中的决策语句if

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  6. [agc004e]Salvage Robots dp

    Description 蛤蟆国的领土我们可以抽象为H*W的笼子,在这片蛤土上,有若干个机器人和一个出口,其余都是空地,每次蛤蟆会要求让所有的机器人向某个方向移动一步,当机器人移动到出口时会被蛤蟆活摘出 ...

  7. MIT 黑科技:通过脑电波和手势控制机器人

    简评:麻省理工黑科技,虽然现在能实现的操作还很简单,但前景(想象空间)非常巨大. 通常,控制机器人并不容易,常规手段就是编程.但是地球上从来不缺天马行空的科学家,今日 MIT 的计算机科学与人工智能实 ...

  8. ZooKeeper参数

    原文连接:https://www.cnblogs.com/skyl/p/4854553.html ZooKeeper参数调优   zookeeper的默认配置文件为zookeeper/conf/zoo ...

  9. Ionic——下一代 APP 开发框架

    http://www.tuicool.com/articles/iY3ENvY 最近 Facebook React 团队释出了 React Native, 用来构建 Mobile Native 应用. ...

  10. 2016级算法第四次上机-B ModricWang的序列问题

    1019 ModricWang的序列问题 思路 此题题意非常清晰,给定一个序列,求出最长上升子序列的长度.从数据规模来看,需要\(O(nlogn)\) 的算法. \(O(nlongn)\) 求最长上升 ...