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

86 lines
2.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.WebSockets;
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 MahApps.Metro.Controls;
using NodeEditor.Extensions;
namespace NodeEditor
{
/// <summary>
/// Interaction logic for EditorCanvas.xaml
/// </summary>
public partial class EditorCanvas : UserControl
{
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);
var transform = mapCanvas.RenderTransform as MatrixTransform;
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)
{
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);
var transform = mapCanvas.RenderTransform as MatrixTransform;
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;
}
}
}