c#,利用WPF的ScaleTransform和TranslateTransform实现图片的缩放效果
一、缩放要求
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实现图片的缩放效果的更多相关文章
- 利用WPF绘图
C#入门经典 25章的一个例子,利用WPF绘图. XAML: <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/p ...
- 利用WPF创建含多种交互特性的无边框窗体
咳咳,标题一口气读下来确实有点累,让我先解释一下.另外文章底部有演示程序的下载. 本文介绍利用WPF创建一个含有以下特性的窗口: 有窗口阴影,比如QQ窗口外围只有几像素的阴影: 支持透明且无边框,为了 ...
- 利用WPF建立自己的3d gis软件(非axhost方式)(十二)SDK中的导航系统
原文:利用WPF建立自己的3d gis软件(非axhost方式)(十二)SDK中的导航系统 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bPew ...
- 利用WPF建立自己的3d gis软件(非axhost方式)(十三)万能的用户层接口,(强大的WPF)
原文:利用WPF建立自己的3d gis软件(非axhost方式)(十三)万能的用户层接口,(强大的WPF) 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt ...
- 利用WPF建立自己的3d gis软件(非axhost方式)(十一)SDK中的动画系统
原文:利用WPF建立自己的3d gis软件(非axhost方式)(十一)SDK中的动画系统 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bPew ...
- 利用WPF建立自己的3d gis软件(非axhost方式)(十)SDK中一些自带的展示面板应用
原文:利用WPF建立自己的3d gis软件(非axhost方式)(十)SDK中一些自带的展示面板应用 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV ...
- 利用WPF建立自己的3d gis软件(非axhost方式)(七)实现简单的粒子效果
原文:利用WPF建立自己的3d gis软件(非axhost方式)(七)实现简单的粒子效果 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bPew密 ...
- 利用WPF建立自己的3d gis软件(非axhost方式)(八)拖动一个UI到地球上
原文:利用WPF建立自己的3d gis软件(非axhost方式)(八)拖动一个UI到地球上 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bPew ...
- 利用WPF建立自己的3d gis软件(非axhost方式)(九)SDK自带部分面板的调用
原文:利用WPF建立自己的3d gis软件(非axhost方式)(九)SDK自带部分面板的调用 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bP ...
随机推荐
- 基于JSP+Servlet开发高校社团管理系统(前台+后台) 源码
基于JSP+Servlet开发高校社团管理系统(前台+后台): 开发环境: Windows操作系统 开发工具:Eclipse/MyEclipse+Jdk+Tomcat+MYSQL数据库 运行效果 ...
- Verilog HDL VGA Driver for Xilinx Nexys 4 适用于Nexys4的VGA驱动
/* * Function: VGA Timing Generator * Author: Liutianchen * Date: 2016-12-5 * Version: 6.0 * Environ ...
- 学习笔记之Struts2—浅析接收参数
最近自己通过视频与相关书籍的学习,对action里面接收参数做一些总结与自己的理解. 0.0.接收参数的(主要)方法 使用Action的属性接收参数 使用DomainModel接收参数 使用Mod ...
- C# Log4.Net日志组件的应用系列(一)
引言 Log4Net应该可以说是.NET中最流行的开源日志组件了.在各种项目框架中可以说是必不可少的组成部分.个人认为Log4Net有下面几个优点: 1. 使用灵活,它可以将日志分不同的等级,以不同的 ...
- CookieJar和HTTPCookieProcessor
CookieJar和HTTPCookieProcessor 我们在使用爬虫的时候,经常会用到cookie进行模拟登陆和访问.在使用urllib库做爬虫,我们需要借助http.cookiejar库中的C ...
- 29.Combination Sum(和为sum的组合)
Level: Medium 题目描述: Given a set of candidate numbers (candidates) (without duplicates) and a targe ...
- Java面向对象之异常(自定义异常)
一.基础概念 在自定义的程序中,如果有了问题.也可以像java中的异常一样,对问题进行描述. 注意:1.继承RuntimeException的异常,不需要进行处理.在执行过程中有异常会直接抛出. 2. ...
- 二 ,Smarty模板技术/引擎——变量操作(1)
1,基本变量 $smarty->assign('data1',3); $smarty->assign('data2',3.45); $smarty->assign('data3',' ...
- Elasticsearch 5.4.1 安装简易文档
1. 系统安装JDK 1.8.0_131或以上版本的JDK 2. 创建软件安装目录 # mkdir -p /opt/software3. 创建elk用户,新版的ELK不在支持使用root账户运行程序, ...
- NVIDIA | 一种重建照片的 AI 图像技术
简评:或许可以称之为「擦擦乐」~ 建议大家看看视频示例 ~ 前几天,NVIDIA 的研究人员介绍了一种新的 深度学习 方法,使用该方法可以重建缺失像素的图像内容. 这种方法被称为「image inpa ...