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 ...
随机推荐
- SSMS查询快捷方式设置
打开SQL Server Mangement Studio,然后依次打开:工具->选项->环境->键盘->查询快捷方式,大家可以看到,SSMS已经自带了12个快捷键,其中3个已 ...
- C#多线程学习(二) 如何操纵一个线程
在C#中,线程入口是通过ThreadStart代理(delegate)来提供的,你可以把ThreadStart理解为一个函数指针,指向线程要执行的函数,当调用Thread.Start()方法后,线程就 ...
- C# 异常日志记录
using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Web; na ...
- UI Automator Viewer的使用
uiautomatorviewer是android SDK自带的工具.通过截屏并分析XML布局文件的方式,为用户提供控件信息查看服务.该工具位于SDK目录下的tools\bin子目录下.可以看到,它是 ...
- linux的档案权限和目录配置
Linux一般将档案可存取的身份分为三个类别,分别是 owner/group/others /etc/passwd 账号信息 /etc/shadow 个人密码 /etc/group 组名记录 ...
- sql case 函数与详细说明
下面是一个是用case函数来完成这个功能的例子 case具有两种格式.简单case函数和case搜索函数. --简单case函数 case sex when '1' then '男' ...
- linux开始之旅-01 linux需要知道的这几位
首先介绍几个人,没有这几个人就没有linux. 第一个:肯·汤普逊(左)和丹尼斯·里奇(右) ------ C语言之父 ------学计算机的人都应该认识吧,计算机学院楼道里面都会有这两位. 美 ...
- Python导模块问题
我们在import一个模块的时候,有没有想过如果我重复的import会怎么样?导入时都做了些什么?让我们来看看 1.首先我们新建一个demo,py,里面只有一句输出语句 2.多次导入demo,运行之后 ...
- loj #6032. 「雅礼集训 2017 Day2」水箱 线段树优化DP转移
$ \color{#0066ff}{ 题目描述 }$ 给出一个长度为 \(n\) 宽度为 \(1\) ,高度无限的水箱,有 \(n-1\) 个挡板将其分为 \(n\) 个 \(1 - 1\) 的小格, ...
- struts2的优缺点
Struts2框架10个优点:1.可以用任何POJO(存粹的java类)来接收表单输入.可以把POJO视为一个Action类 Action类:获得Form表单数据,并处理逻辑的类: DAO类:进行数据 ...