c#,利用WPF的ScaleTransform和TranslateTransform實現圖片的縮放效果

1、縮放要求spa

1.縮放對象在可視區域內,已對象的中心點進行縮放。.net

2.縮放對象比可視區大,而且對象各邊界都在可視區外圍,那麼已鼠標位置進行縮放。code

3.縮放對象比可視區大,可是縮放後某一邊界在可視區的對應邊界內,那麼該邊界與可視區邊界對齊,對向縮放。orm

 

 

2、縮放代買片斷對象

複製代碼
 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         }
複製代碼

 

代碼:blog

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

相關文章
相關標籤/搜索