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>