public IEdge <int> Connect(IVertice <int> vertice, int cost) { if (vertice != this && !this.Connected(vertice)) { var edge = new EdgeControl(this, (VerticeControl)vertice, cost); edges.Add(edge); vertice.Edges.Add(edge); return(edge); } return(null); }
public virtual void Render() { if (!rendered) { vertices = new List <IVertice <int> >(VerticesCount); var idx = 0; foreach (var pt in SpreadPoints()) { var vertice = new VerticeControl((char)(idx + 'A')); vertice.MouseLeave += VerticeControl_MouseLeave; vertice.PreviewMouseLeftButtonUp += VerticeControl_PreviewMouseLeftButtonUp; vertice.MouseLeftButtonUp += VerticeControl_MouseLeftButtonUp; vertice.InputStateChanged += VerticeControl_InputStateChanged; vertice.IsEnabledChanged += VerticeControl_IsEnabledChanged; vertice.CanvasLeft = pt.X; vertice.CanvasTop = pt.Y; Panel.SetZIndex(vertice, VerticeZIndex); vertice.SetBinding(VerticeControl.BackgroundProperty, new Binding("Background") { Source = this, Mode = BindingMode.OneTime }); vertice.SetBinding(VerticeControl.ForegroundProperty, new Binding("Foreground") { Source = this, Mode = BindingMode.OneTime, Converter = new CloneConverter() }); vertice.SetBinding(VerticeControl.SizeProperty, new Binding("VerticesSize") { Source = this, Mode = BindingMode.OneTime }); vertice.SetBinding(VerticeControl.PreviewColorProperty, new Binding("PreviewColor") { Source = this }); vertices.Add(vertice); canvas.Children.Add(vertice); idx++; } edges = new List <IEdge <int> >((VerticesCount * (VerticesCount - 1)) / 2); for (int i = 1; i < VerticesCount; i++) { var v1 = Vertices[i] as VerticeControl; for (int j = 0; j < i; j++) { var v2 = Vertices[j] as VerticeControl; if (v1.Connect(v2, 0) is EdgeControl edgeControl) { edgeControl.X1 = v1.CanvasLeft; edgeControl.Y1 = v1.CanvasTop; edgeControl.X2 = v2.CanvasLeft; edgeControl.Y2 = v2.CanvasTop; edgeControl.MouseLeftButtonUp += Grid_MouseLeftButtonUp; edgeControl.MouseMove += Grid_MouseMove; Panel.SetZIndex(edgeControl, EdgesZIndex); var binding = new Binding("VerticesSize") { Source = this, Mode = BindingMode.OneTime, Converter = new SizeRatioConverter() { Ratio = 0.2 } }; edgeControl.SetBinding(EdgeControl.SizeProperty, binding); edgeControl.SetBinding(EdgeControl.ForegroundProperty, new Binding("Foreground") { Source = this, Mode = BindingMode.OneTime, Converter = new CloneConverter() }); //edgeControl.CostChanged += Edge_CostChanged; canvas.Children.Add(edgeControl); edges.Add(edgeControl); } } } { supportLine = new EdgeControl(); supportLine.MouseLeftButtonUp += Grid_MouseLeftButtonUp; supportLine.MouseMove += Grid_MouseMove; Panel.SetZIndex(supportLine, SupportLineZIndex); var binding = new Binding("VerticesSize") { Source = this, Converter = new SizeRatioConverter() { Ratio = 0.2 } }; supportLine.SetBinding(EdgeControl.SizeProperty, binding); supportLine.SetBinding(EdgeControl.ForegroundProperty, new Binding("PreviewBrush") { Source = this }); supportLine.Highlighted = true; supportLine.Visibility = Visibility.Hidden; canvas.Children.Add(supportLine); } rendered = true; } }