You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
NodeEditor/Controls/EditorCanvas.xaml.cs

72 lines
2.5 KiB
C#

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
namespace NodeEditor.Controls
{
/// <summary>
/// Interaction logic for EditorCanvas.xaml
/// </summary>
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;
}
}
}