First add a canvas:
Set width and height to auto:
Add a button.
Now comes a tricky part, at least for me, since I don't know how to delete margins from Visual Studio GUI, so I had to do it manually from XAML. So, here is my XAML:
<Window x:Class="DragNdrop.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <Canvas Margin="20" HorizontalAlignment="Left" VerticalAlignment="Top"> <Button Content="Button" PreviewMouseLeftButtonDown="Button_PreviewMouseLeftButtonDown" PreviewMouseLeftButtonUp="Button_PreviewMouseLeftButtonUp" PreviewMouseMove="Button_PreviewMouseMove"/> </Canvas> </Grid> </Window>
Notice that margins from button node are deleted, and margin is equal 20 on canvas (Margin="20"), otherwise button will be away from mouse pointer.
Code looks like this:
public partial class MainWindow : Window { private double FirstXPos; private double FirstYPos; private double FirstArrowXPos; private double FirstArrowYPos; private object MovingObject; public MainWindow() { InitializeComponent(); } private void Button_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { FirstXPos = e.GetPosition(sender as Control).X; FirstYPos = e.GetPosition(sender as Control).Y; FirstArrowXPos = e.GetPosition((sender as Control).Parent as Control).X - FirstXPos - 20; FirstArrowYPos = e.GetPosition((sender as Control).Parent as Control).Y - FirstYPos - 20; MovingObject = sender; } private void Button_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) { MovingObject = null; } private void Button_PreviewMouseMove(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed && sender == MovingObject) { (sender as Control).SetValue(Canvas.LeftProperty, e.GetPosition((sender as Control).Parent as Control).X - FirstXPos - 20); (sender as Control).SetValue(Canvas.TopProperty, e.GetPosition((sender as Control).Parent as Control).Y - FirstYPos - 20); } } }
Code you can download from here, dirty as usual and made in VS 2013