/// <summary> /// Bring the collection of nodes into view. /// This affects ContentViewportOffsetX/ContentViewportOffsetY, but doesn't affect 'ContentScale'. /// </summary> public void BringNodesIntoView(ICollection nodes) { if (nodes == null) { throw new ArgumentNullException("'nodes' argument shouldn't be null."); } if (nodes.Count == 0) { return; } Rect rect = Rect.Empty; foreach (var node in nodes) { NodeItem nodeItem = FindAssociatedNodeItem(node); Rect nodeRect = new Rect(nodeItem.X, nodeItem.Y, nodeItem.ActualWidth, nodeItem.ActualHeight); if (rect == Rect.Empty) { rect = nodeRect; } else { rect.Intersect(nodeRect); } } this.BringIntoView(rect); }
/// <summary> /// Find the max ZIndex of all the nodes. /// </summary> internal int FindMaxZIndex() { if (this.nodeItemsControl == null) { return(0); } int maxZ = 0; for (int nodeIndex = 0; ; ++nodeIndex) { NodeItem nodeItem = (NodeItem)this.nodeItemsControl.ItemContainerGenerator.ContainerFromIndex(nodeIndex); if (nodeItem == null) { break; } if (nodeItem.ZIndex > maxZ) { maxZ = nodeItem.ZIndex; } } return(maxZ); }
/// <summary> /// Find the NodeItem UI element that is associated with 'node'. /// 'node' can be a view-model object, in which case the visual-tree /// is searched for the associated NodeItem. /// Otherwise 'node' can actually be a 'NodeItem' in which case it is /// simply returned. /// </summary> internal NodeItem FindAssociatedNodeItem(object node) { NodeItem nodeItem = node as NodeItem; if (nodeItem == null) { nodeItem = nodeItemsControl.FindAssociatedNodeItem(node); } return(nodeItem); }
/// <summary> /// Event raised while the user is dragging a node. /// </summary> private void NodeItem_Dragging(object source, NodeDraggingEventArgs e) { e.Handled = true; // // Cache the NodeItem for each selected node whilst dragging is in progress. // if (this.cachedSelectedNodeItems == null) { this.cachedSelectedNodeItems = new List <NodeItem>(); foreach (var selectedNode in this.SelectedNodes) { NodeItem nodeItem = FindAssociatedNodeItem(selectedNode); if (nodeItem == null) { throw new ApplicationException("Unexpected code path!"); } this.cachedSelectedNodeItems.Add(nodeItem); } } // // Update the position of the node within the Canvas. // foreach (var nodeItem in this.cachedSelectedNodeItems) { nodeItem.X += e.HorizontalChange; nodeItem.Y += e.VerticalChange; } var eventArgs = new NodeDraggingEventArgs(NodeDraggingEvent, this, this.SelectedNodes, e.HorizontalChange, e.VerticalChange); RaiseEvent(eventArgs); }