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;
            }
        }