惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Proofpoint News Feed
博客园 - 聂微东
Application and Cybersecurity Blog
Application and Cybersecurity Blog
MyScale Blog
MyScale Blog
罗磊的独立博客
H
Help Net Security
L
LangChain Blog
T
Threat Research - Cisco Blogs
量子位
S
Securelist
Last Week in AI
Last Week in AI
L
Lohrmann on Cybersecurity
T
The Exploit Database - CXSecurity.com
P
Privacy International News Feed
The Hacker News
The Hacker News
Vercel News
Vercel News
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cybersecurity and Infrastructure Security Agency CISA
T
The Blog of Author Tim Ferriss
T
Threatpost
Security Latest
Security Latest
P
Palo Alto Networks Blog
Microsoft Security Blog
Microsoft Security Blog
NISL@THU
NISL@THU
F
Full Disclosure
WordPress大学
WordPress大学
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Stack Overflow Blog
Stack Overflow Blog
C
Check Point Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
酷 壳 – CoolShell
酷 壳 – CoolShell
H
Heimdal Security Blog
J
Java Code Geeks
Recorded Future
Recorded Future
Hugging Face - Blog
Hugging Face - Blog
G
GRAHAM CLULEY
Know Your Adversary
Know Your Adversary
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
阮一峰的网络日志
阮一峰的网络日志
U
Unit 42
B
Blog RSS Feed
月光博客
月光博客
C
Cisco Blogs
V
Visual Studio Blog
D
DataBreaches.Net
H
Hacker News: Front Page
博客园 - 叶小钗
N
News and Events Feed by Topic
爱范儿
爱范儿
A
Arctic Wolf

博客园 - Lance Yang

批量插入Oracle,遇到CLob字段慢的解决办法 自定义控件如何给特殊类型的属性添加默认值 z(转) Oracle 12c心得 Entity Framework Code First (八)迁移 Migrations EF Code First学习笔记 C#判断程序是由Windows服务启动还是用户启动 全方位掌握 NSIS 的操作 NSIS学习笔记(转) C#开源框架(整理) 十大前端开发框架(转) .Net 学习 C# 实现无焦点窗体(转载) C++C#时间转换 C#调用C++导出类(转) Socket异步发送的同步控制 自己编码实现数据库的映射实体的代码生成器 C# P/Invoke中传递数组参数 Digital image processing In C# C#数字图像处理(摘录)
c#,利用WPF的ScaleTransform和TranslateTransform实现图片的缩放效果
Lance Yang · 2017-07-15 · via 博客园 - Lance Yang

一、缩放要求

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