100 lines
3.8 KiB
C#
100 lines
3.8 KiB
C#
using Aurora;
|
|
using System;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Input;
|
|
using System.Windows.Media;
|
|
|
|
namespace WeldingCommon.Views
|
|
{
|
|
/// <summary>
|
|
/// Interaction logic for UCConvEdgeObject.xaml
|
|
/// </summary>
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
}
|