private async void UpdateLine(Line line, Ellipse el) { Point mp = Mouse.GetPosition(this); line.X1 = mp.X; line.Y1 = mp.Y; line.X2 = mp.X; line.Y2 = mp.Y; while (Mouse.LeftButton == MouseButtonState.Pressed) //Пока нажата ЛКМ, конец линии будет иметь координаты курсора мыши { await Task.Delay(5); Point p = Mouse.GetPosition(this); line.X2 = p.X; line.Y2 = p.Y; if (Mouse.LeftButton == MouseButtonState.Released) //Когда ЛКМ отпущена и курсор находится над эллипсом, создается ребро. В противном случае линия будет удалена. { foreach (Ellipse elem in ellist) { if (p.X >= elem.Margin.Left && p.X <= elem.Margin.Left + elw && p.Y >= elem.Margin.Top && p.Y <= elem.Margin.Top + elh) { if (elem == el) { break; } try { Weight wg = new Weight(); wg.Show(); await WaitWhileActive(wg); string txt = wg.wght.Text; Edge edge = new Edge(list[ellist.IndexOf(el)], list[ellist.IndexOf(elem)], int.Parse(txt), line); TextBlock tb = new TextBlock(); tb.Text = txt; tb.FontSize = 16; tb.TextAlignment = TextAlignment.Center; tb.Width = 40; tb.Height = 20; tb.HorizontalAlignment = HorizontalAlignment.Left; tb.VerticalAlignment = VerticalAlignment.Top; tb.Margin = new Thickness(line.X2 - (line.X2 - line.X1) / 2, line.Y2 - (line.Y2 - line.Y1) / 2 - 10, 0, 0); edge.TB = tb; grid.Children.Add(tb); graph.Edges.Add(edge); edges.Add(edge); } catch { grid.Children.Remove(line); return; } graph.Add(list[ellist.IndexOf(el)], list[ellist.IndexOf(elem)]); return; } } grid.Children.Remove(line); } } }