/// <summary> /// 计算线的起点 /// </summary> /// <param name="p_node"></param> /// <returns></returns> LinkPortPosition CaclStart(FrameworkElement p_node) { double left = Canvas.GetLeft(p_node); double top = Canvas.GetTop(p_node); double right = left + p_node.Width; double bottom = top + p_node.Height; Dictionary <LinkPortPosition, Point> dictPt = new Dictionary <LinkPortPosition, Point>(); dictPt.Add(LinkPortPosition.LeftTop, new Point(left, top)); dictPt.Add(LinkPortPosition.TopCenter, new Point(left + p_node.Width / 2, top)); dictPt.Add(LinkPortPosition.RightTop, new Point(right, top)); dictPt.Add(LinkPortPosition.RightCenter, new Point(right, top + p_node.Height / 2)); dictPt.Add(LinkPortPosition.RightBottom, new Point(right, bottom)); dictPt.Add(LinkPortPosition.BottomCenter, new Point(left + p_node.Width / 2, bottom)); dictPt.Add(LinkPortPosition.LeftBottom, new Point(left, bottom)); dictPt.Add(LinkPortPosition.LeftCenter, new Point(left, top + p_node.Height / 2)); Point ptCur = new Point(_line.X2, _line.Y2); LinkPortPosition startPos = LinkPortPosition.RightBottom; double distance = double.MaxValue; foreach (LinkPortPosition pos in dictPt.Keys) { double dis = GetDistance(ptCur, dictPt[pos]); if (dis < distance) { distance = dis; startPos = pos; } } //更改开始位置 _line.X1 = dictPt[startPos].X; _line.Y1 = dictPt[startPos].Y; return(startPos); }
/// <summary> /// 无指向的线(将被删除)的线移动参数构造函数 /// </summary> /// <param name="p_line"></param> /// <param name="p_isHeadNode"></param> /// <param name="p_oldNode"></param> /// <param name="p_oldPos"></param> public LineMoveCmdArgs(SLine p_line, bool p_isHeadNode, SNode p_oldNode, LinkPortPosition p_oldPos) { _line = p_line; _isHeadNode = p_isHeadNode; _oldNode = p_oldNode; _oldPos = p_oldPos; }
void OnLinkDragCompleted(object sender, DragCompletedEventArgs e) { SNode curNode = _owner.SelectionClerk.Selection[0] as SNode; LinkPortPosition startPos = CaclStart(curNode); Rect thumbRect = new Rect(Canvas.GetLeft(_thumb), Canvas.GetTop(_thumb), _thumb.ActualWidth, _thumb.ActualHeight); if (_owner.IsValidRegion(thumbRect)) { SNode tagNode = _owner.GetFirstIntersect(thumbRect); if (tagNode != null) { //是否存在连接 bool isHas = (from obj in _owner.Container.Children let line = obj as SLine where line != null && line.HeaderID == curNode.ID && line.TailID == tagNode.ID select line).Any(); if (!isHas) { SLine line = new SLine(_owner); line.HeaderID = curNode.ID; line.HeaderPort = startPos; line.TailID = tagNode.ID; line.TailPort = _owner.GetLinkPosition(tagNode, thumbRect); _owner.Insert(line); _owner.SelectionClerk.SelectLine(line); _owner.RefreshLinkLines(tagNode); } } } //还原默认位置 Canvas.SetLeft(_thumb, _thumbX); Canvas.SetTop(_thumb, _thumbY); _line.Visibility = Visibility.Collapsed; _owner.LinkThumbEnd(); }
/// <summary> /// 设置有效点 /// </summary> /// <param name="p_pos"></param> public void SetValidPos(LinkPortPosition p_pos) { VisualStateManager.GoToState(this, p_pos.ToString(), true); }