Пример #1
0
        /// <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);
        }
Пример #2
0
 /// <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;
 }
Пример #3
0
        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();
        }
Пример #4
0
 /// <summary>
 /// 设置有效点
 /// </summary>
 /// <param name="p_pos"></param>
 public void SetValidPos(LinkPortPosition p_pos)
 {
     VisualStateManager.GoToState(this, p_pos.ToString(), true);
 }