Skip to content

Instantly share code, notes, and snippets.

@geocine
Last active December 5, 2022 11:34
Show Gist options
  • Save geocine/0b33d306fa5510f58c22f2c9f9d1ba33 to your computer and use it in GitHub Desktop.
Save geocine/0b33d306fa5510f58c22f2c9f9d1ba33 to your computer and use it in GitHub Desktop.
Mouse Move
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Shapes;

namespace WpfApp
{
  public partial class MainWindow : Window
  {
    private Point _mousePosition;
    private bool _isMouseDown = false;

    public MainWindow()
    {
      InitializeComponent();

      canvas.PreviewMouseDown += Canvas_PreviewMouseDown;
      canvas.PreviewMouseMove += Canvas_PreviewMouseMove;
      canvas.PreviewMouseUp += Canvas_PreviewMouseUp;
    }

    private void Canvas_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
      if (e.Source is Rectangle innerSquare)
      {
        _isMouseDown = true;
        _mousePosition = e.GetPosition(canvas);
      }
    }

    private void Canvas_PreviewMouseMove(object sender, MouseEventArgs e)
    {
      if (_isMouseDown)
      {
        var position = e.GetPosition(canvas);
        var offset = position - _mousePosition;
        Canvas.SetLeft(innerSquare, Canvas.GetLeft(innerSquare) + offset.X);
        Canvas.SetTop(innerSquare, Canvas.GetTop(innerSquare) + offset.Y);
        _mousePosition = position;
      }
    }

    private void Canvas_PreviewMouseUp(object sender, MouseButtonEventArgs e)
    {
      _isMouseDown = false;
    }
  }
}

Xaml

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
  <Grid>
    <Canvas Name="canvas" Background="LightGray">
      <Rectangle Name="innerSquare" Width="100" Height="100" Fill="Red" Canvas.Left="100" Canvas.Top="100" />
    </Canvas>
  </Grid>
</Window>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment