166 lines
6.4 KiB
C#
166 lines
6.4 KiB
C#
using System.Text;
|
|
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;
|
|
|
|
namespace CtrEditor
|
|
{
|
|
/// <summary>
|
|
/// Interaction logic for MainWindow.xaml
|
|
/// </summary>
|
|
public partial class MainWindow : Window
|
|
{
|
|
private Point _lastMousePosition;
|
|
private bool _isDrawing = false;
|
|
private bool _isDragging = false;
|
|
private Image imagenDeFondo;
|
|
|
|
public MainWindow()
|
|
{
|
|
InitializeComponent();
|
|
this.Loaded += MainWindow_Loaded;
|
|
ImagenEnTrabajoScrollViewer.PreviewMouseWheel += ImagenEnTrabajoCanvas_MouseWheel;
|
|
ImagenEnTrabajoCanvas.MouseDown += Canvas_MouseDown_Panning;
|
|
ImagenEnTrabajoCanvas.MouseMove += Canvas_MouseMove_Panning;
|
|
ImagenEnTrabajoCanvas.MouseUp += Canvas_MouseUp_Panning;
|
|
}
|
|
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
|
|
{
|
|
if (DataContext is MainViewModel viewModel)
|
|
{
|
|
viewModel.ImageSelected += ViewModel_ImageSelected;
|
|
viewModel.TickSimulacion += MainViewModel_TickSimulacion;
|
|
}
|
|
}
|
|
private void ViewModel_ImageSelected(object sender, string imagePath)
|
|
{
|
|
LoadImageToCanvas(imagePath);
|
|
}
|
|
|
|
private void LoadImageToCanvas(string imagePath)
|
|
{
|
|
BitmapImage bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));
|
|
|
|
if (imagenDeFondo == null)
|
|
{
|
|
imagenDeFondo = new Image();
|
|
ImagenEnTrabajoCanvas.Children.Add(imagenDeFondo);
|
|
}
|
|
imagenDeFondo.Source = bitmap;
|
|
RenderOptions.SetBitmapScalingMode(imagenDeFondo, BitmapScalingMode.HighQuality);
|
|
|
|
|
|
// Elimina solo los ROIs, no la imagen de fondo
|
|
for (int i = ImagenEnTrabajoCanvas.Children.Count - 1; i >= 0; i--)
|
|
{
|
|
if (ImagenEnTrabajoCanvas.Children[i] is Rectangle)
|
|
{
|
|
ImagenEnTrabajoCanvas.Children.RemoveAt(i);
|
|
}
|
|
}
|
|
|
|
// Ajusta el tamaño del Canvas a la imagen, si es necesario
|
|
ImagenEnTrabajoCanvas.Width = bitmap.Width;
|
|
ImagenEnTrabajoCanvas.Height = bitmap.Height;
|
|
|
|
// Posiciona la imagen correctamente dentro del Canvas
|
|
Canvas.SetLeft(imagenDeFondo, 0);
|
|
Canvas.SetTop(imagenDeFondo, 0);
|
|
|
|
}
|
|
|
|
private void Canvas_MouseUp_Panning(object sender, MouseButtonEventArgs e)
|
|
{
|
|
if (_isDragging)
|
|
{
|
|
_isDragging = false;
|
|
ImagenEnTrabajoScrollViewer.ReleaseMouseCapture(); // Finaliza la captura del ratón
|
|
}
|
|
}
|
|
|
|
private void Canvas_MouseDown_Panning(object sender, MouseButtonEventArgs e)
|
|
{
|
|
if (e.LeftButton == MouseButtonState.Pressed && !_isDrawing)
|
|
{
|
|
// Indica que se inicia el panning
|
|
_isDragging = true;
|
|
// Guarda la posición actual del ratón
|
|
_lastMousePosition = e.GetPosition(ImagenEnTrabajoScrollViewer);
|
|
//ImagenEnTrabajoScrollViewer.CaptureMouse(); // Importante para capturar el movimiento
|
|
}
|
|
}
|
|
|
|
private void Canvas_MouseMove_Panning(object sender, MouseEventArgs e)
|
|
{
|
|
if (_isDragging && !_isDrawing)
|
|
{
|
|
// Calcula el nuevo desplazamiento basado en el movimiento del ratón
|
|
var currentPosition = e.GetPosition(ImagenEnTrabajoScrollViewer);
|
|
var dx = currentPosition.X - _lastMousePosition.X;
|
|
var dy = currentPosition.Y - _lastMousePosition.Y;
|
|
|
|
// Ajusta el desplazamiento del ScrollViewer
|
|
ImagenEnTrabajoScrollViewer.ScrollToHorizontalOffset(ImagenEnTrabajoScrollViewer.HorizontalOffset - dx);
|
|
ImagenEnTrabajoScrollViewer.ScrollToVerticalOffset(ImagenEnTrabajoScrollViewer.VerticalOffset - dy);
|
|
|
|
// Actualiza la posición del ratón para el próximo movimiento
|
|
_lastMousePosition = currentPosition;
|
|
}
|
|
}
|
|
|
|
private void ImagenEnTrabajoCanvas_MouseWheel(object sender, MouseWheelEventArgs e)
|
|
{
|
|
var st = (ScaleTransform)ImagenEnTrabajoCanvas.LayoutTransform;
|
|
double zoomFactor = e.Delta > 0 ? 1.1 : 0.9;
|
|
Point cursorPosition = e.GetPosition(ImagenEnTrabajoScrollViewer);
|
|
|
|
// Calcular el punto focal del zoom relativo al contenido del ScrollViewer
|
|
var absoluteX = ImagenEnTrabajoScrollViewer.HorizontalOffset + cursorPosition.X;
|
|
var absoluteY = ImagenEnTrabajoScrollViewer.VerticalOffset + cursorPosition.Y;
|
|
|
|
// Aplicar el zoom
|
|
st.ScaleX *= zoomFactor;
|
|
st.ScaleY *= zoomFactor;
|
|
|
|
// Calcular el nuevo desplazamiento para que el zoom se centre en la posición del cursor
|
|
ImagenEnTrabajoScrollViewer.UpdateLayout(); // Asegurarse de que el layout del ScrollViewer esté actualizado
|
|
var newHorizontalOffset = absoluteX * zoomFactor - cursorPosition.X;
|
|
var newVerticalOffset = absoluteY * zoomFactor - cursorPosition.Y;
|
|
|
|
// Aplicar el nuevo desplazamiento
|
|
ImagenEnTrabajoScrollViewer.ScrollToHorizontalOffset(newHorizontalOffset);
|
|
ImagenEnTrabajoScrollViewer.ScrollToVerticalOffset(newVerticalOffset);
|
|
|
|
e.Handled = true; // Evita el procesamiento adicional del evento
|
|
}
|
|
|
|
private void MainViewModel_TickSimulacion(object sender, TickSimulacionEventArgs e)
|
|
{
|
|
// aquí puedes agregar la lógica para actualizar tus UserControl
|
|
// en el ImagenEnTrabajoCanvas
|
|
foreach (var child in ImagenEnTrabajoCanvas.Children)
|
|
{
|
|
if (child is ICtrSimulado uc)
|
|
{
|
|
// llama al método Update de cada UserControl
|
|
uc.Update();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void MainWindow_Closed(object sender, EventArgs e)
|
|
{
|
|
if (DataContext is MainViewModel viewModel)
|
|
{
|
|
viewModel.ImageSelected -= ViewModel_ImageSelected;
|
|
}
|
|
}
|
|
|
|
}
|
|
} |