schangxiang@126.com
2025-11-04 f5ed29dc26c7cd952d56ec5721a2efc43cd25992
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using XHandler.Class;
 
namespace XHandler.View.BacteriaPickResult
{
    /// <summary>
    /// 挑菌结果图片预览页面
    /// </summary>
    public partial class ImagePreview : UserControl
    {
        public event EventHandler closeEvent;
 
        private bool _startMove;
       // private int i;
        private Point start;
        public ImagePreview(string imgPath)
        {
            InitializeComponent();
            Img.Source = BitmapFrame.Create(new Uri(imgPath), BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
        }
 
        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            double zoom = Math.Min(Sv.ViewportWidth / Img.Source.Width, Sv.ViewportHeight / Img.Source.Height);
            Matrix matrix = new Matrix();
            matrix.M11 = zoom;
            matrix.M22 = zoom;
            matrix.OffsetX = (Sv.ViewportWidth - Sv.ViewportHeight) / 2;
           ((MatrixTransform)viewBox.RenderTransform).Matrix = matrix;
 
        }
 
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            if (EventResponseController.Instance.CanExecute() == false)
                return;
            closeEvent?.Invoke(this, EventArgs.Empty);
        }
 
        private void ChangSize(bool big, FrameworkElement ctrl, double centerX, double centerY)
        {
            var m = ((MatrixTransform)ctrl.RenderTransform).Matrix;
            if (big)
            {
                m.ScaleAtPrepend(1.1, 1.1, centerX, centerY);
            }
            else
            {
                m.ScaleAtPrepend(1 / 1.1, 1 / 1.1, centerX, centerY);
            }
            ctrl.RenderTransform = new MatrixTransform(m);
        }
 
        private void Box_OnMouseWheel(object sender, MouseWheelEventArgs e)
        {
            var centerPt = e.GetPosition(viewBox);
            ChangSize(e.Delta > 0, viewBox, centerPt.X, centerPt.Y);
        }
 
        private void Box_OnPreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (viewBox.IsMouseCaptured) return;
            viewBox.CaptureMouse();
            start = e.MouseDevice.GetPosition(Sv);
            e.Handled = true;
            _startMove = true;
        }
 
        private void Box_OnPreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            viewBox.ReleaseMouseCapture();
            _startMove = false;
        }
 
        private void Box_OnPreviewMouseMove(object sender, MouseEventArgs e)
        {
            if (!viewBox.IsMouseCaptured || !_startMove) return;
            var point = e.MouseDevice.GetPosition(Sv);
            var m = viewBox.RenderTransform.Value;
            //计算x偏移量 
            m.OffsetX = m.OffsetX + point.X - start.X;
            //计算y偏移量
            m.OffsetY = m.OffsetY + point.Y - start.Y;
            viewBox.RenderTransform = new MatrixTransform(m);
            //给鼠标起点和图片临时位置重新赋值
            start = point;
        }
 
 
    }
}