Witam,
pisze program w którym potrzebuję przesuwać elementy, napisałem taką funkcję:

private void MouseMove(object sender, MouseEventArgs eventArgs)
        {
            if (_check)
            {
                Canvas.SetLeft((sender as Ellipse) ?? throw new InvalidOperationException(), Mouse.GetPosition(((MainWindow)Application.Current.MainWindow).canvas).X - (sender as Ellipse).Width / 2 -6);
                Canvas.SetTop((sender as Ellipse) ?? throw new InvalidOperationException(), Mouse.GetPosition(((MainWindow)Application.Current.MainWindow).canvas).Y - (sender as Ellipse).Width / 2);
                CentralPoint.X = Canvas.GetLeft((sender as Ellipse)) + (sender as Ellipse).Width/2;
                CentralPoint.Y = Canvas.GetTop((sender as Ellipse)) + (sender as Ellipse).Width/2;

                var sw = Stopwatch.StartNew();
                
                do
                {
                    foreach (var edge in List)
                    {
                        edge.RePaint(edge.Line);
                    }
                    Thread.Sleep(5);
                } while (sw.ElapsedMilliseconds <= 5);
                sw.Stop();
                
            }
        }

I widzę jej niedoskonałość w tym że zdarza się że element zostanie "zgubiony" przez mysz, tzn. jak wykonam szybki ruch podczas przesuwania elementu to kursor wysunie się poza element i nie można go przesuwać (można jak się znów najedzie myszą na niego) ale chciałbym żeby gubienie nie było możliwe albo bardzo trudne do zrobienia. Gdzieś czytałem że nie jest dobrze robić czegoś w stylu void rePaint(), ja tak zrobiłem z niewiedzy. Szukam innego poprawnego rozwiązania, aplikację piszę w WPF. Również chętnie przyjmę dobre matriały do nauki WPF, C#