using Aurora; using System; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; namespace WeldingCommon.Views { /// /// Interaction logic for UCConvEdgeObject.xaml /// public partial class UCConvEdgeObject : UserControl { private UCConvEdgeObjectViewModel _viewModel; private Point _start; private Point _origin; private double _initialScaleX; private double _initialScaleY; public UCConvEdgeObject(IAuroraEnvironment aurora) { InitializeComponent(); _viewModel = new UCConvEdgeObjectViewModel(aurora); DataContext = _viewModel; ImageControl.MouseWheel += ImageCanvas_MouseWheel; ImageControl.MouseLeftButtonDown += ImageCanvas_MouseLeftButtonDown; ImageControl.MouseLeftButtonUp += ImageCanvas_MouseLeftButtonUp; ImageControl.MouseMove += ImageCanvas_MouseMove; // Store the initial scale of the image this.Loaded += (s, e) => { var transformGroup = (TransformGroup)ImageControl.RenderTransform; var scaleTransform = (ScaleTransform)transformGroup.Children[0]; _initialScaleX = scaleTransform.ScaleX; _initialScaleY = scaleTransform.ScaleY; }; } private void ImageCanvas_MouseWheel(object sender, MouseWheelEventArgs e) { var position = e.GetPosition(ImageControl); var transformGroup = (TransformGroup)ImageControl.RenderTransform; var scaleTransform = (ScaleTransform)transformGroup.Children[0]; var translateTransform = (TranslateTransform)transformGroup.Children[1]; double zoom = e.Delta > 0 ? 0.1 : -0.1; double newScaleX = scaleTransform.ScaleX + zoom; double newScaleY = scaleTransform.ScaleY + zoom; // Ensure the new scale is not smaller than the initial scale if (newScaleX < _initialScaleX || newScaleY < _initialScaleY) { newScaleX = _initialScaleX; newScaleY = _initialScaleY; } // Calculate the new position of the image to keep the zoom centered double relativeX = position.X / ImageControl.ActualWidth; double relativeY = position.Y / ImageControl.ActualHeight; double absoluteX = position.X - translateTransform.X; double absoluteY = position.Y - translateTransform.Y; scaleTransform.ScaleX = newScaleX; scaleTransform.ScaleY = newScaleY; translateTransform.X = absoluteX - relativeX * ImageControl.ActualWidth * newScaleX; translateTransform.Y = absoluteY - relativeY * ImageControl.ActualHeight * newScaleY; } private void ImageCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (e.ButtonState == MouseButtonState.Pressed) { _start = e.GetPosition(this); _origin = new Point(ImageTranslateTransform.X, ImageTranslateTransform.Y); ImageControl.Cursor = Cursors.Hand; ImageControl.CaptureMouse(); } } private void ImageCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { ImageControl.ReleaseMouseCapture(); ImageControl.Cursor = Cursors.Arrow; } private void ImageCanvas_MouseMove(object sender, MouseEventArgs e) { if (ImageControl.IsMouseCaptured) { Vector v = _start - e.GetPosition(this); ImageTranslateTransform.X = _origin.X - v.X; ImageTranslateTransform.Y = _origin.Y - v.Y; } } } }