Zrobiłem kiedyś proste przesuwanie kontrolek na planszy dla jednej aplikacji. Szykałem gotowych bibliotek do tego, ale nic nie udało mi się znaleźć. Skończyło się na tym, że podpinałem się do trzech zdarzeń MouseDown, MouseMove i MouseUp. Dzięki temu wiedziałem kiedy obiekt zaczyna być przeciągany, kiedy jest w trakcie przeciągania i kiedy przeciąganie się kończy. Używałem marginesów do sterowania pozycją, ale można tez użyć Canvas i pozycji X oraz Y. Wklejam kod jaki używałem:
var rec = new Rectangle(); // Tworzę obiekt "Prostokąt"
rec.Width = 200; // Nadaję mu szerokość i wysokość
rec.Height = 200;
rec.Fill = Brushes.Red; // Wypełniam czerwonym kolorem
plansza.Children.Add(rec); // Dodaję go do planszy o nazwie "plansza", wcześniej utworzonej
rec.MouseDown += mouseDown; // Podpinam trzy zdarzenia do prostokąta
rec.MouseMove += mouseMove;
rec.MouseUp += mouseUp;
Nullable<Point> dragStart = null; // Zmienna pomocnicza, służąca do przechowywania pozycji przeciąganego elementu
void mouseDown(object sender, MouseButtonEventArgs e)
{
var element = (UIElement)sender;
dragStart = e.GetPosition(element); // Zapisuję pozycję elementu gdy zaczyna być przesuwany (pozycja początkowa)
element.CaptureMouse(); // Włączam przechwytywanie pozycji myszki dla elementu
}
void mouseUp (object sender, MouseButtonEventArgs e)
{
var element = (UIElement)sender;
dragStart = null;
element.ReleaseMouseCapture(); // Wyłączam przechwytywanie pozycji myszki dla elementu
}
void mouseMove (object sender, MouseEventArgs e)
{
if (dragStart != null && e.LeftButton == MouseButtonState.Pressed) // Sprawdzam, czy ktoś kliknął na element i czy dalej przycisk jest wciśnięty
{
Point p = Mouse.GetPosition(plansza); // Wczytuję aktualną pozycję myszki wzgędem planszy
var rec = sender as Rectangle;
rec.Margin = new Thickness(p.X - dragStart.Value.X, p.Y - dragStart.Value.Y, 0, 0); // Steruję pozycją elementu za pomocą marginesów. Ustawiam pozycję za pomocą różnicy między pozycją początkową "dragStart", aktualną pozycją myszki.
}
}