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