Esempio n. 1
0
        /// <summary>
        ///     Position and resize all children.
        /// </summary>
        /// <param name="finalSize"></param>
        /// <returns></returns>
        protected override System.Windows.Size ArrangeOverride(System.Windows.Size finalSize)
        {
            var actualRect = new Rect(0, 0, ActualWidth, ActualHeight);

            foreach (Line line in _edgesToItems.Values)
            {
                line.Arrange(actualRect);
            }

            if (_currentPositions != null)
            {
                Vector offset = GetNodeOffset(finalSize);

                foreach (var node in _currentPositions)
                {
                    Point  position = node.Value - offset;
                    Vector nodeOffset;

                    NetworkViewNodeItem item;
                    if (_nodesToItems.TryGetValue(node.Key, out item))
                    {
                        if (ReferenceEquals(item, _mouseDraggingNode))
                        {
                            _algorithm.SetPosition(node.Key, item.Position);
                        }
                        else
                        {
                            item.DisplayPosition = position;
                            item.Position        = node.Value;
                        }

                        item.Arrange(new Rect(item.DisplayPosition, item.DesiredSize));
                        nodeOffset = new Vector(item.DesiredSize.Width / 2, item.DesiredSize.Height / 2);
                    }
                    else
                    {
                        nodeOffset = new Vector(0, 0);
                    }

                    foreach (var pair in _edgesToItems)
                    {
                        Point edgePosition = item.DisplayPosition + nodeOffset;
                        IEdge edge         = pair.Key;
                        Line  line         = pair.Value;
                        if (ReferenceEquals(edge.Node1, node.Key))
                        {
                            line.X1 = edgePosition.X;
                            line.Y1 = edgePosition.Y;
                        }
                        if (ReferenceEquals(edge.Node2, node.Key))
                        {
                            line.X2 = edgePosition.X;
                            line.Y2 = edgePosition.Y;
                        }
                    }
                }
            }
            return(finalSize);
        }