一、縮放要求
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

