2026-03-30 17:09:29 +09:00

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;
}
}
}
}