public ConnectorAdorner(MyCanvas designer, Connector sourceConnector)
     : base(designer)
 {
     this.designerCanvas = designer;
     this.sourceConnector = sourceConnector;
     drawingPen = new Pen(Brushes.LightSlateGray, 1);
     drawingPen.LineJoin = PenLineJoin.Round;
     this.Cursor = Cursors.Cross;
 }
 public Connection(Connector source, Connector sink, string strContent , List<string> m_Connection)
 {
     Source = source;
     Sink = sink;
     Brach = m_Connection;
     SelectedBrach = strContent;
     base.Loaded += new RoutedEventHandler(Connection_Loaded);
     base.Unloaded += new RoutedEventHandler(Connection_Unloaded);
 }
        /// <summary>
        /// 测试是否已经命中元素
        /// </summary>
        /// <param name="hitPoint">鼠标点击的坐标</param>
        private void HitTesting(Point hitPoint)
        {
            bool hitConnectorFlag = false;
            DependencyObject hitObject = designerCanvas.InputHitTest(hitPoint) as DependencyObject;
            while (hitObject != null &&
                   hitObject != sourceConnector.ParentDesignerItem &&
                   hitObject.GetType() != typeof(MyCanvas))
            {
                if (hitObject is Connector)
                {
                    HitConnector = hitObject as Connector;
                    hitConnectorFlag = true;
                }

                if (hitObject is DesignerItem)
                {
                    HitDesignerItem = hitObject as DesignerItem;
                    var parentitem = hitDesignerItem.FindVisualTreeAncestor(x => x is Connector);
                    Control connectorDecorator = HitDesignerItem.Template.FindName("PART_ConnectorDecorator", HitDesignerItem) as Control;
                    List<DependencyObject> item = connectorDecorator.FindVisualTreeChildren(x => x is Connector);

                    foreach (var connector in item)
                    {
                        var data = connector as Connector;
                        if (Math.Abs(data.Position.X - hitPoint.X) < 18 && Math.Abs(data.Position.Y - hitPoint.Y) < 18)
                        {
                            hitConnector = data;
                            hitConnectorFlag = true;
                            break;
                        }
                    }
                    if (!hitConnectorFlag)
                    {
                        HitConnector = null;
                    }
                    return;
                }
                hitObject = VisualTreeHelper.GetParent(hitObject);
            }

            HitConnector = null;
            HitDesignerItem = null;
        }
        /// <summary>
        /// 拖拽开始
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void thumbDragThumb_DragStarted(object sender, DragStartedEventArgs e)
        {
            this.HitDesignerItem = null;
            this.HitConnector = null;
            this.pathGeometry = null;
            this.Cursor = Cursors.Cross;
            this.connection.StrokeDashArray = new DoubleCollection(new double[] { 1, 2 });

            if (sender == sourceDragThumb)
            {
                fixConnector = connection.Sink;
                dragConnector = connection.Source;
            }
            else if (sender == sinkDragThumb)
            {
                dragConnector = connection.Sink;
                fixConnector = connection.Source;
            }
        }