using AuroraUIComponent.Util; using System; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using static WeldingCommon.Views.UCManualRCCOperationViewModel; namespace WeldingCommon.Views { /// /// Interaction logic for UCManualRCCOperation.xaml /// public partial class UCManualRCCOperation : UserControl { private UCManualRCCOperationViewModel _ViewModel; private System.Windows.Point _StartPoint; private System.Windows.Point _OriginPoint; private double _InitialScaleX; private double _InitialScaleY; public UCManualRCCOperation(UCManualRCCOperationViewModel viewModel) { InitializeComponent(); _ViewModel = viewModel; 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.5 : -0.5; 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 on the mouse pointer double offsetX = position.X - (position.X * newScaleX / scaleTransform.ScaleX); double offsetY = position.Y - (position.Y * newScaleY / scaleTransform.ScaleY); scaleTransform.ScaleX = newScaleX; scaleTransform.ScaleY = newScaleY; translateTransform.X -= offsetX; translateTransform.Y -= offsetY; } private void ImageCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (e.ButtonState == MouseButtonState.Pressed) { _StartPoint = e.GetPosition(this); _OriginPoint = new System.Windows.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 = _StartPoint - e.GetPosition(this); ImageTranslateTransform.X = _OriginPoint.X - v.X; ImageTranslateTransform.Y = _OriginPoint.Y - v.Y; } } #region Grid ContourCorrectionInfoList private void PasteCommand_Executed_ContourCorrectionInfoList(object sender, ExecutedRoutedEventArgs e) { if (GridEditorContourCorrectionInfoList.PasteFromClipboard(null)) { GridEditorContourCorrectionInfoList.CommitEdit(); GridEditorContourCorrectionInfoList.Items.Refresh(); } } private void GridEditorContourCorrectionInfoList_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) { if (_ViewModel != null) { foreach (var item in e.RemovedCells) { if (item.Item is ContourCorrectionInfo) { _ViewModel.SelectedContourCorrectionInfoList.Remove(item.Item as ContourCorrectionInfo); } } foreach (var item in e.AddedCells) { if (item.Item is ContourCorrectionInfo) { var newItem = item.Item as ContourCorrectionInfo; if (!_ViewModel.SelectedContourCorrectionInfoList.Contains(newItem)) { _ViewModel.SelectedContourCorrectionInfoList.Add(newItem); } } } } } private void GridEditorContourCorrectionInfoList_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { if (!IsVisible) { _ViewModel.SelectedContourCorrectionInfoList.Clear(); GridEditorContourCorrectionInfoList.UnselectAllCells(); } else { } } private void GridEditorContourCorrectionInfoList_KeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Escape) { if (sender is DataGrid dg) { dg.SelectedItem = null; } if (sender is System.Windows.Controls.ListBox lb) { lb.SelectedItem = null; } } } #endregion } }