2026-01-26 18:56:53 +09:00

158 lines
6.0 KiB
C#

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
{
/// <summary>
/// Interaction logic for UCManualRCCOperation.xaml
/// </summary>
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
}
}