using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using NodeEditor.Extensions; namespace NodeEditor.Controls { /// /// Interaction logic for EditorCanvas.xaml /// public partial class EditorCanvas : UserControl { private Point? _dragStart = null; public EditorCanvas() { InitializeComponent(); m_EditorCanvas.MouseMove += MapCanvas_Drag; m_EditorCanvas.MouseDown += MapCanvas_StartDrag; m_EditorCanvas.MouseUp += MapCanvas_StopDrag; m_EditorCanvas.MouseWheel += MapCanvas_OnScroll; } private void MapCanvas_StartDrag(object sender, MouseEventArgs e) { var element = (UIElement) sender; // dragStart = new Point(e.GetPosition(mapCanvas).X * st.ScaleX, e.GetPosition(mapCanvas).Y * st.ScaleY); if (mapCanvas.RenderTransform is MatrixTransform transform) _dragStart = new Point(e.GetPosition(mapCanvas).X * transform.Value.M11, e.GetPosition(mapCanvas).Y * transform.Value.M22); element.CaptureMouse(); } private void MapCanvas_StopDrag(object sender, MouseEventArgs e) { var element = (UIElement)sender; _dragStart = null; element.ReleaseMouseCapture(); } private void MapCanvas_Drag(object sender, MouseEventArgs e) { if (_dragStart == null || e.LeftButton != MouseButtonState.Pressed) return; var newPoint = e.GetPosition(m_EditorCanvas); Canvas.SetLeft(mapCanvas, newPoint.X - _dragStart.Value.X); Canvas.SetTop(mapCanvas, newPoint.Y - _dragStart.Value.Y); } private void MapCanvas_OnScroll(object sender, MouseWheelEventArgs e) { // if (e.Delta > 0) // { // st.ScaleX *= 1.1; // st.ScaleY *= 1.1; // } // else // { // st.ScaleX /= 1.1; // st.ScaleY /= 1.1; // } var element = sender as UIElement; var position = e.GetPosition(element); if (!(mapCanvas.RenderTransform is MatrixTransform transform)) return; var matrix = transform.Matrix; var scale = e.Delta >= 0 ? 1.1 : (1.0 / 1.1); // choose appropriate scaling factor matrix.ScaleAtPrepend(scale, scale, position.X, position.Y); transform.Matrix = matrix; } } }