yFiles WPF Release Notes

Version 3.2 is the current major release of yFiles WPF.
The latest release of yFiles WPF is version 3.2.0.1. (See also the entire yFiles WPF change log.)

Technical Requirements

  • .NET Framework 4.0 or later or .NET Core 3.0.
  • A browser to view the HTML documentation.
  • A Microsoft Windows operating system that supports one of the aforementioned .NET versions.

yFiles WPF 3.2 - Changes Since 3.1.0.2

Hide Description
Open in yEd LiveDownload
yFiles WPF 3.2 Release Notes
New support for targeting .NET Core
yFiles WPF 3.2 Release Notes
New support for bus-like arrangement in HierarchicLayout
yFiles WPF 3.2 Release Notes
New IGraph-based API for the powerful graph analysis algorithms

This release contains many new major features and lots of other new features, improvements, and bugfixes for all parts of the library. In addition to the new demos that show the new features, there are some notable new demos and demo improvements, too.

Major New Features

Support for .NET Core

yFiles WPF now provides assemblies for both .NET Framework and .NET Core. All demos and tutorials are also provided for both frameworks.

Improved documentation including more than 1000 new example code snippets

The documentation has been improved. Particularly, more than 1000 new code examples have been added to the API documentation.

Bus-like placement in hierarchic layouts
The HierarchicLayout class is now able to arrange children of a specified root node in a bus-like way. This results in a very compact and uniform arrangement if a node has many successors. The bus sub-structures are defined by the HierarchicLayoutData.Buses property, and the new BusDescriptor class provides more individual settings for the buses.
Label placement, bus routing, and port grouping for EdgeRouter

The EdgeRouter class now features integrated edge label placement. Labels are automatically placed when the new property IntegratedEdgeLabeling is enabled. The placement considers the optional PreferredPlacementDescriptor of a label.

Also, it now supports port grouping of edges at their source and target and orthogonal bus routing. To specify the port group IDs or the bus affiliation, use the associated properties in the PolylineEdgeRouterData class.

Analysis wrapper

The powerful analysis algorithms got a new API that is based on the IGraph interface and streamlines working with the results. In particular, it makes working with a special analysis graph class obsolete. The algorithms that are available with the new API include centrality measures, clustering, flow calculation, rank assignment, spanning tree, shortest path, and more.

This is accompanied by the new GraphStructureAnalyzer class that provides methods to check structural properties of a given graph.

The new GraphAnalysis demo allows you to interactively explore all the algorithms.

NuGet Support

The yFiles WPF assemblies can easily be bundled into NuGet packages. The packages support multiple targets.

New and improved demos

This release contains the following new demos:

  • The new LayoutStyles demo showcases the features and settings of the yFiles automatic layout algorithms.
  • The new MazeRouting demo shows how the automatic edge routing can be used to find a route through a maze.
  • Added import feature for BPMN 2.0 abstract syntax format (Diagram Interchange).

New Features

View

  • The DefaultLabelStyle class got some new features:
    • Support for insets that specify a distance between the label border and the label content.
    • New properties for minimum and maximum size to restrict the size of the label.
    • The ability to quantify the preferred size to avoid unnecessary floating point precision when saving.
    • New static properties to enlarge the preferred size which can be useful when converting graphs between different platforms.
  • The CreateEdgeInputMode class can now create edges in reversed direction, i.e., starting from the target port.
    • The new EdgeDirectionPolicy supports starting creation at the source, at the target, in the last direction, or depending on the port candidate.
    • A configurable ToggleDirectionRecognizer allows changing the edge direction during creation.
  • The new property MoveLabelInputMode.AllowUnselected enables moving labels without having to select them first.
  • The method CreateEdgeInputMode.DoStartEdgeCreation that is used to programmatically start an interactive edge creation gesture now returns a Task with the newly created edge as result (or null if the gesture was canceled).
  • The method MoveInputMode.DoStartDrag that is used to programmatically start an interactive drag gesture now returns a Task with the affected items as result (or null if the gesture was canceled).
  • The GraphModelManager class has the new methods Raise, Lower, ToFront and ToBack that allow for changing the z-order of IModelItems. All these z-order-related methods can also be triggered by the new commands Raise, Lower, ToFront and ToBack.

    In addition, the GraphEditorInputMode class provides the new methods RaiseSelection, LowerSelection, SelectionToFront and SelectionToBack that change the z-order of all selected IModelItems.

  • The new PortStyleDecorationInstaller class allows the use of an IPortStyle to render the selection, highlight, or focus indicator of ports.

Layout

  • The HierarchicLayout class is now able to uniformly distribute ports at group nodes - with a few restrictions. The new property HierarchicLayoutData.UniformPortAssignmentGroups. defines the groups for which the feature should be enabled.
  • The HierarchicLayout class is now able to consider individual crossing costs for edges and for crossing a group node border. These can be defined with the HierarchicLayoutData.EdgeCrossingCosts and the HierarchicLayoutData.GroupBorderCrossingCosts properties.

    In addition, the new callback method DefaultLayerSequencer.GetCrossingCost allows to define an individual crossing cost value for a specific pair of edges when using this sequencer for the HierarchicLayout. In order to easily retrieve the original edge instance when customizing the hierarchic layout, the HierarchicLayout.GetOriginalEdge method was added.

  • The LeftRightNodePlacer class now supports layouts with multiple branches. With this feature, subtrees can not only be placed left/right of a single vertical bus, but left/right of multiple vertical buses (the branches). The new property BranchCount allows to configure the number of branches.
  • The tree node placer GridNodePlacer offers the following new features:
    • The placement of the bus for routes to its children can now be configured using the new enumeration BusPlacement. Available placements are Leading, Trailing and Center.
    • Child sub-trees can be assigned to rows automatically using the new property GridNodePlacer.AutomaticRowAssignment.
    • The new alignment policy GridNodePlacer.BusAligned aligns the root node with the bus.
  • The OrganicLayout class is now able to consider user-specified inertia and stress values for nodes.
  • The OrthogonalLayout class is now able to consider custom crossing and bend costs for edges. They can be specified using the new properties OrthogonalLayoutData.EdgeCrossingCosts and OrthogonalLayoutData.EdgeBendCosts respectively.
  • The new InteractiveOrganicLayout.CompactnessFactor property specifies the compactness of the result. If the graph contains several components, this feature can prevent that the components drift apart.
  • The new GivenCoordinatesStage class changes node locations and edge paths to user-specified values before invoking the core layout algorithm. To specify locations and paths, use the new GivenCoordinatesStageData class.
  • The new GenericPartitionGridSupportStage class offers generic support for partition grid structures.
  • The OrganicLayout class is now able to produce 3D layout results.
  • The new ChannelRoutingTool class brings back the features of the ChannelRouter class that was removed in version 3.0.

Improvements

Graph and View

  • GraphOverviewControl no longer draws nodes and edges that are hidden via VoidNodeStyle and VoidEdgeStyle.
  • NodeStylePortStyleAdapter and PortControlPortStyle now have an Offset property that allows to shift the port visualization so that it no longer is centered over the port.
  • The GraphModelManager class has new factory methods for creating the ItemModelManager of each item group.
  • DefaultEdgePathCropper's methods CropEdgePath and CropEdgePathAtArrow have been made virtual.
  • The performance of EdgePathLabelModel.GetGeometry and EdgeSegmentLabelModel.GetGeometry has been strongly increased.
  • The GraphModelManager.GetModelItem method now always returns the IModelItem for an ICanvasObject retrieved for it via GetMainCanvasObject. Previously this only worked in all cases for the ICanvasObject retrieved via GetCanvasObject.
  • Added the GraphClipboard.GetId method to facilitate retrieving the original item from which an item to be pasted has been copied from.
  • The new property GraphClipboard.ClipboardContext provides access to the current IGraphClipboardContext during a clipboard operation.
  • The properties RectangleIndicatorInstaller.Template and OrientedRectangleIndicatorInstaller.Template now return always the value that has been set by client code and are not modified by internal code anymore.

Input

  • The new property CreateEdgeInputMode.ShowTargetHighlight specifies whether to enable or disable highlighting of potential targets for edge creation. Also, the method UpdateTargetHighlight has been added to allow for further customization of the highlight.
  • The new properties PortRelocationHandler.ShowTargetHighlight and PortRelocationHandlerProvider.ShowTargetHighlight specify whether to enable or disable highlighting of potential targets for edge creation. Also, the method UpdateHighlight has been added to the PortRelocationHandler class to allow for further customization of the highlight.
  • The new properties PortRelocationHandler.ShowPortCandidates and PortRelocationHandlerProvider.ShowPortCandidates specify whether to enable or disable showing port candidates during edge relocation.
  • The GraphEditorInputMode.DeletedItem event provides now context information about the state before the item has been deleted. For example, if a label has been deleted you now can get its old owner.
  • The method GraphEditorInputMode.OnDeletedItem is now virtual.
  • Snaplines are now infinitely long by default.
  • HandleInputMode now clears the AffectedItems after the Canceled event has been raised instead of before.
  • GraphEditorInputMode provides new protected methods CreateLabelCore and EditLabelCore to allow for overriding the default implementations.
  • Fixed some rare cases where a new label was erroneously created by interactive editing instead of editing an existing one.
  • The methods AddLabel, CreateLabel and EditLabel of GraphEditorInputMode and TableEditorInputMode that are used to start the respective interactive label editing gesture programmatically now return a Task with the edited or newly created label as result. Therefore, these methods can be awaited.
  • GraphEditorInputMode provides a TextEditorInputModeConfigurator property to allow for configuring the TextEditorInputMode before each label editing.
  • NavigationInputMode: Added a property ScrollToSelection that controls whether a node that is focused or selected with a keyboard gesture is automatically scrolled into the viewport if necessary.

GraphML Serialization

  • The GraphMLIOHandler class now supports reading and writing arbitrary objects at graph level.
  • GraphML: Name mappings for both closed and unbound generic types are now supported.
  • GraphML: Generic type arguments are now available as a property of the QueryTypeEventArgs.
  • SizeDValueSerializer and SizeDConverter can now read the strings "Zero" and "Infinite".
  • RectDValueSerializer and RectDConverter can now read the string "Infinite".
  • PointDValueSerializer and PointDConverter can now read the string "Origin".

Graph-Layout-Bridge

  • Combining multiple LayoutData classes is now easier:
    • The base class LayoutData offers a new method CombineWith that combines the current instance with another LayoutData instance.
    • The class CompositeLayoutData has an additional constructor that takes a variable number of LayoutData instances.
  • The new PortAdjustmentPolicy property of LayoutExecutor and LayoutGraphAdapter replaces the previous ImprovePortAssignment boolean property. The new property is of type PortAdjustmentPolicy and offers more options for adjusting the port locations after a layout calculation.
  • The viewport animation of the LayoutExecutor class considers now the value of the LimitFitContentZoom property of the corresponding GraphControl.

Hierarchic Layout

  • The HierarchicLayout class now also considers critical edge priorities for grouped edges.
  • The HierarchicLayout class now also considers sequence constraints for grouped edges.
  • The HierarchicLayout class now uses the specified layer alignment to align sub-components (see HierarchicLayoutData.SubComponents).
  • With HierarchicLayout, the number of edges crossing through group nodes without starting or ending in them when using the default algorithm settings was reduced. Furthermore, the behavior can be customized using the new group node border crossing costs (see property HierarchicLayoutData.GroupBorderCrossingCosts).
  • The HierarchicLayout class no longer inserts superfluous bends for edges between group nodes if the input graph contains grouped edges.
  • The layering of HierarchicLayout was improved with respect to the resulting edge lengths if the recursive group layering feature is enabled.
  • The HierarchicLayout class now produces less overlapping elements for graphs with fixed coordinate hints.
  • The HierarchicLayout class now correctly calculates the group node bounds. Previously, the groups' insets were slightly too large (up to one pixel).
  • The HierarchicLayout class now always places a port label in the middle of a node side, if it is the only port on that side. Previously it was only centered if the label was additionally placed on the edge.
  • The HierarchicLayout class now requires less memory for graphs with sequence constraints.

Edge Routing

  • The EdgeRouter now supports edge grouping on both endpoints. Previously, an edge could only be part of either a source or a target group.
  • The EdgeRouter class now generates less edge-edge overlaps and a better distribution of edge segments when the EdgeRouter.MaximumDuration is strongly restricted or set to zero, or when the algorithm is stopped via the AbortHandler.Stop method.
  • The EdgeRouter class now avoids superfluous bends that were in some cases caused by group nodes with (small) inset values.
  • The path search performance of the EdgeRouter class has been improved for cases where an edge has a strong, external PortConstraint or a fixed, external PortCandidate.
  • The EdgeRouter class now generates a proper routing from a group node border to a port location inside this group node defined by a strong PortConstraint or a fixed PortCandidate. Previously, the route was only calculated to the border and then the last segment was extended without consideration of obstacles and other elements.
  • The new properties AbortHandler, SourcePortConstraints, TargetPortConstraints, SourcePortCandidates, and TargetPortCandidates of ChannelEdgeRouterData facilitate using these features with ChannelEdgeRouter.

Labeling

  • The performance of the GenericLabeling algorithm and the quality of the label placements were improved.
  • The quality of edge label placement of the GenericLabeling class was improved in case that there are multiple labels with a source or target preference near the same node. They may now be placed further away but avoid undesired overlaps.

Other Layouts

  • The new OrthogonalLayout.PreferParallelRoutes property allows for controlling how parallel edges (multi-edges) are routed.
  • New options of the PlaceNodeAtBarycenterStage class allow for specifying the size of affected nodes, considering the grouping structure when calculating the barycenter of nodes as well as removing the bends of edges incident to affected nodes.
  • The TreeReductionStage now marks non-tree edges if an IDataAcceptor is registered with the input graph with key TreeReductionStage.NonTreeEdgeSelectionKey. This way a user is able to query which edges the algorithm determined to be the non-tree edges.
  • The RecursiveGroupLayout class now allows to define a local PartitionGrid structure for each recursively handled group node. See the new property RecursiveGroupLayoutData.GroupNodePartitionGrids for details.
  • If the master edge is clipped on the bounds of its source or target, the ParallelEdgeRouter class now always clips the associated parallel edges on that bounds, too.
  • The RemoveCollinearBendsStage.Scale property now also allows zero and negative numbers as its value. This makes it possible to internally round coordinates to full integer values for the comparison of bend points and, thus, the stage can be made more fuzzy.
  • The properties Rows and Columns of class PartitionGrid are now of type IEnumerable<RowDescriptor> and IEnumerable<ColumnDescriptor> instead of an un-typed YList.
  • The PartitionGridData class has new properties OptimizeRowOrder and OptimizeColumnOrder to indicate whether or not the order of the rows respectively columns should be chosen automatically to minimize edge lengths.

    In addition, the RowIndices and ColumnIndices properties of the PartitionGridData class can now also be used in combination with the Grid property.

  • The PortCalculator class now considers edge label positions such they are not affected by whether this stage is applied or not (see property LayoutExecutor.PortAdjustmentPolicy). Previously, label positions could be changed if the label position was stored relative to the first or last segment or the port.

Demos

  • The demos now have shorter projects and folder names.

Bugfixes

Graph and View

  • Fixed a bug in the graph implementation that sometimes lead to a runtime that was quadratic in the number of nodes when creating large graphs.
  • Fixed a bug in the UndoEngine class that resulted in memory leaks if the tokens returned by GetToken were not disposed when the UndoEngine got cleared.
  • The null check for the GridVisualCreator.Pen property works correctly now.
  • Fixed a bug in EdgePathLabelModel which could return an invalid geometry for parameters with a ratio < 0 and zero length edge segments.
  • GeneralPath.Flatten(): Fixed unexpected behavior if a curve follows after a close operation.
  • Fixed a bug in DictionaryMapper and WeakDictionaryMapper where entries with key null were not included in the mapper's Entries enumeration.
  • Fixed an exception which could occur in CanvasControl's method CompareRenderOrder and when using GraphModelManager's Comparer property.
  • You can now use OverviewInputMode.ViewportTemplateKey in the XAML resources of a GraphOverviewControl directly.
  • Fixed text trimming in DefaultLabelStyle which was incorrect for TextWrapping = NoWrap in multi line labels.
  • Fixed a bug in FilteredGraphWrapper which prevented port labels from being correctly added or removed together with their port owner after the predicate changed.

Input

  • Reparenting an expanded group node into a collapsed group node no longer throws an error.
  • With SmartEdgeLabelModel, it was impossible to move a label from the left side of an edge to the right side. Instead, the label stopped at the edge.
  • The CreateEdgeInputMode class now considers the value of the CanvasControl.HitTestRadius property when its StartOverCandidateOnly property is enabled.
  • GraphClipboard's methods OnElementCut and OnElementCopied are no longer called for graph items which are not copied themselves but are owners of copied items.

    As a consequence, the methods Cut and Copy of the IClipboardHelper implementations of these elements are no longer called, either.

  • When an edge is duplicated using GraphClipboard and a port is newly created during this operation, the new port now gets the old port's style and tag.
  • The visualization of source port candidates by the CreateEdgeInputMode class does not flicker, anymore.
  • Fixed a bug in GraphEditorInputMode where changing the value of ShowHandleItems while handles were already displayed resulted in duplicate handles.
  • Fixed a bug in PortRelocationHandleProvider where the settings ShowPortCandidates and ShowTargetHighlight were ignored.
  • Fixed a bug in CreateEdgeInputMode.GetPortOwner which could return edges even if AllowEdgeToEdgeCreation was set to false. This could result in the edge's IPortCandidateProvider being queried for candidates erroneously.
  • Zooming the viewport during interaction no longer synthesizes mouse-move events in the wrong locations.
  • Changing the viewport using CanvasControl.Center now propertly re-dispatches the last mouse event.
  • Fixed a bug that prevented drag events from correctly reporting the changed modifier keys.

GraphML Serialization

  • Parsing a GraphML file with a folding edge state with a label without a preferred size no longer throws an error.
  • Labels at folder nodes and their adjacent edges are no longer lost during GraphML deserialization if the DefaultFolderNodeConverter.CopyFirstLabel property is enabled.
  • Fixed GraphML exception when parsing generic types.

Hierarchic Layout

  • The HierarchicLayout class now correctly considers the group insets for input graphs with nested group nodes. Previously, it sometimes produced too large insets for inner groups.
  • The HierarchicLayout class no longer throws an error if it is wrapped by an instance of RecursiveGroupLayout and the input graph contains layering constraints between elements of different groups.
  • The HierarchicLayout class no longer throws an ArgumentException for some rare cases in incremental layout mode.
  • The HierarchicLayout class now produces shorter, more direct edge routes for edges connecting at a group node and leaving on the the left/right group side. This only affects cases where the relevant group node also contains direct-content edges (see EdgeLayoutDescriptor.DirectGroupContentEdgeRouting).
  • Self-loop segments generated by the HierarchicLayout class are now shorter and take up less space if possible. Previously, segments were sometimes unnecessarily long even though the minimum length settings allowed shorter segments.
  • The HierarchicLayout class now produces less superfluous crossings if there are same-layer edges with PortConstraints or PortCandidates.
  • The HierarchicLayout class now correctly handles port labels with zero height or width. Previously, such labels may have caused very large distances between some nodes.
  • The HierarchicLayout class sometimes threw an ArgumentError for input graphs that contained incremental elements in combination with groups.
  • The HierarchicLayout class now places sloped segments of grouped octilinear edges such that they are perfectly overlapping each other. Previously, it could happen that segments were slightly displaced with respect to each other.
  • The HierarchicLayout class no longer causes non-orthogonal segments when the input contained port labels in conjunction with edge grouping.
  • The HierarchicLayout class sometimes threw an ArgumentError for input graphs that contained fixed elements in combination with both swimlanes and groups.
  • The HierarchicLayout class now correctly considers fixed nodes with layering constraints. In previous versions there were some rare cases where such inputs caused infinite looping issues.
  • The HierarchicLayout class no longer produces intersections between edges and elements of a sub-component (see HierarchicLayoutData.subComponents). Note that this fix may sometimes cause less compact results within a layer.
  • The HierarchicLayout class no longer throws an exception if the component arrangement policy is set to ComponentArrangementPolicy.Compact and bus routing is enabled (see property HierarchicLayoutData.Buses).

Tree Layout

  • The CompactNodePlacer class no longer throws an exception for input graphs with specified memento strategies (see TreeLayoutData.CompactNodePlacerStrategyMementos or CompactNodePlacer.StrategyMementoDpKey).
  • The CompactNodePlacer class now correctly considers the specified values of the VerticalDistance and HorizontalDistance properties.
  • The CompactNodePlacer class no longer throws an exception for some inputs with specified strategy memento information.
  • The SimpleNodePlacer class no longer produces unnecessarily long horizontal edge segments.

Edge Routing

  • The EdgeRouter class now correctly routes direct content edges with strong port constraints at the group nodes. Previously, the algorithm sometimes produced weird routes for such edges.
  • Fixed a bug in the EdgeRouter class that sometimes caused a non-deterministic behavior.
  • The EdgeRouter class now correctly handles edges with external ports. Previously, such inputs may have caused an exception.
  • The EdgeRouter class now correctly groups edges associated with equal group IDs that have a different object ID.
  • A rare error that was triggered by the EdgeRouter class during routing when a Grid is defined on which edges need to be routed is now fixed.
  • The EdgeRouter class now avoids unnecessary bends in cases that contain PortCandidates with fixed offsets (or strong PortConstraints) where the fixed port locations have a very similar x- or y-coordinate such that the path must consist of three segments with a single, very short middle segment. Previously, five segments in total were generated.
  • The PolylineLayoutStage class no longer generates overlaps between sloped, polyline segments created by the stage and unrelated other obstacles (e.g. nodes).
  • Fixed a rare error that was triggered by the EdgeRouter class during routing in cases where the input contained grouped edges.
  • The EdgeRouter class no longer throws an exception if the EdgeRouter.PolylineRouting property is enabled and the input contains fixed, grouped edges.
  • The EdgeRouter class now considers the correct NodeHalo associated with the target node when handling the minimum last segment length setting. Previously it incorrectly considered the halo of the source node which could lead to unnecessarily long or too short last segments.
  • The EdgeRouter class now correctly considers intersections between edges and labels of fixed edges if property ConsiderEdgeLabels is enabled.
  • The EdgeRouter class no longer throws an error during routing in cases where the source or target node is covered by obstacles (i.e. by other nodes or labels).
  • The EdgeRouter class now correctly considers intermediate routing points when using the polyline routing style. Previously, it could happen that intermediate points were not part of the final polyline edge path.
  • The EdgeRouter class no longer considers all PortCandidates with multiple directions as fixed PortCandidates.
  • Fixed two issues that induced the violation of a PortCandidate with fixed offsets (or a strong PortConstraint) by the EdgeRouter class. The first was only triggered for constraints at the target side and only when the target node was additionally partly or fully covered by other obstacles (e.g. node labels). The second issue appeared in cases with the source and target node fully overlapping (e.g. an edge from a group to a child node).
  • Improved the path search performance of the EdgeRouter class for cases where a large number of fixed and overlapping edge segments exist. Previously, the search could become very slow in such scenarios.
  • The EdgeRouter class now correctly handles cases where the maximum duration is exceeded and where previously an exception was triggered.
  • Fixed a StackOverflowException in EdgeRouter.
  • The EdgeRouter class no longer produces bad, non-orthogonal edge segments in cases where a selected edge is grouped together with an un-selected edge and where both edges have strong PortConstraints at their common source/target node.
  • The EdgeRouter class no longer throws an exception if all fixed edges of a bus are non orthogonal/octilinear.
  • The EdgeRouter class now correctly considers strong port constraints of edges that belong to a bus structure.

Labeling

  • The GenericLabeling class now produces better results for edge labels that have a preferred distance to the edge (PreferredPlacementDescriptor.DistanceToEdge) and at the same time multiple SideOfEdge preferences (e.g. left of edge and on the edge). Previously, the algorithm sometimes violated the preferred distance even though it would have been possible to keep it.
  • The GenericLabeling class now correctly places labels of direct content edges (edges that directly connect a group node with a descendant, without leaving the group) with a free edge label model.
  • The GenericLabeling class no longer calculates wrong label profit values for some edge labels. Previously, edges that had a PreferredPlacementDescriptor were sometimes affected.
  • The GenericLabeling class now always prefers LabelCandidates with higher profit values over others with lower profit. Previously, this sometimes happened even though both candidates did not intersect with other elements.
  • The GenericLabeling class no longer assumes that all LabelCandidates associated to a label have the same size. Previously, this caused unexpected labeling results if custom candidates with different sizes were given.
  • We fixed a rare bug in the GenericLabeling that may have caused an ArgumentException for some input graphs that contain edges with zero length segments and labels associated with a free edge label model.
  • The GenericLabeling class no longer throws an ArgumentException for some input graphs containing labeled edges with zero length.

Other Layout Styles

  • The OrthogonalLayout class no longer throws an exception when property OrthogonalLayout.UniformPortAssignment is enabled and the input contains parallel edges.
  • The OrthogonalLayout class no longer causes an exception for some input graphs when property FaceMaximization is enabled.
  • The OrthogonalLayout class no longer runs into an infinite loop for some input graphs that are tree structures with mixed edge directedness. Note that the problem only occurred if property OrthogonalLayout.TreeStyle is not set to TreeLayoutStyle.None.
  • The OrganicLayout class no longer throws an exception when using CycleSubstructureStyle.Circular and arranging a cycle structure where at least one cycle node is also connected to a group node outside the cycle.
  • The OrganicLayout class now produces deterministic results for group nodes if its property Deterministic is enabled.
  • The OrganicLayout class now correctly considers input graphs where substructure handling is enabled and all nodes are located at coordinate (0,0). Previously, such inputs may have triggered an ArgumentException.
  • When using RecursiveGroupLayout, the values of the properties ComputedWidth, ComputedHeight and ComputedPosition of the classes ColumnDescriptor and RowDescriptor are now correctly set after the layout if EdgeRouter is the corresponding InterEdgeRouter.
  • The ComponentLayout class now correctly handles input graphs with user-specified components that contain nodes with null as their component ID (see property ComponentLayoutData.ComponentIds). Previously, such inputs may have caused an exception.
  • The SeriesParallelLayout class now correctly handles input graphs with groups that only contain disconnected nodes. Previously, such inputs caused an exception.
  • The PartialLayout class now correctly considers the specified PortCandidates during orthogonal or octilinear routing of edges.
  • The PartialLayout class does no longer reduce the size of fixed group nodes if the option PartialLayout.ResizeFixedGroups is disabled.
  • The OrganicRemoveOverlapsStage no longer produces infinite loops in some rare cases.
  • The PortPlacementStage class no longer destroys the grouping information for the core layout algorithm.
  • Fixed a bug in YGraphAdapter that could trigger a NullReferenceException when boolean, integer or double values were requested from registered IMapper but no value had been set beforehand.
  • The GraphStructureAnalyzer.HasMultipleEdges method now returns the correct result for input graphs with self-loops.
  • The Paths.FindAllChains method now correctly calculates the chains for input graphs with cycles.
  • The Bfs.GetLayers method now correctly stores the layer indices in the specified INodeMap. Previously, the maximum layer index stored in the map exceeded the number of returned layers.

Incompatible Changes

Incompatible API Changes

  • The ImprovePortAssignment boolean property of LayoutExecutor and LayoutGraphAdapter has been replaced by the PortAdjustmentPolicy property.
  • SingleItemCollection's Item property has been pulled up to ItemCollection. Class SingleItemCollection has been removed, its usages have been replaced by ItemCollection.
  • ItemCollection's type parameter has been constrained to reference types.
  • The following properties of specific layout data types now have a name with the correct plural or singular usage.
    • HierarchicLayoutData.AlternativeEdgePath has been renamed to AlternativeEdgePaths.
    • TreeLayoutData.LeftRightPlacersLeftNodes has been renamed to LeftRightNodePlacerLeftNodes.
    • TreeLayoutData.DelegatingNodePlacersPrimaryNodes has been renamed to DelegatingNodePlacerPrimaryNodes.
    • FixNodeLayoutData.FixedNode has been renamed to FixedNodes.
  • The type of the properties BalloonLayoutData.TreeRoot and TreeLayoutData.TreeRoot has been changed to SingleItem<INode>.
  • The property HierarchicLayoutData.AlternativeEdgePaths now expects IEnumerable<IPoint> instead of YPointPath as mapped values.
  • The property HierarchicLayoutData.AlternativeGroupBounds now expects IRectangle instead of YRectangle as mapped values.
  • The properties Rows and Columns of class PartitionGrid are now of type IEnumerable<RowDescriptor> and IEnumerable<ColumnDescriptor> instead of an un-typed YList.
  • The properties SourceGroups and TargetGroups of RadialLayoutData have been removed since edge grouping is not supported by the RadialLayout class.
  • The PenaltySettings.InvalidEdgeGroupingPenalty property has been removed. If edge groups are defined, the EdgeRouter class now always considers them. Therefore, this setting no longer applies.
  • IXamlNameMapper.GetType now has a third argument for optional type parameters.

Changes of Default Behavior

  • The SimplexNodePlacer.BarycenterMode property is now enabled by default. Thus, the HierarchicLayout class with default settings now produces different (usually more symmetric) layouts.
  • GraphClipboard's methods OnElementCut and OnElementCopied are no longer called for graph items which are not copied themselves but are owners of copied items.

    As a consequence, the methods Cut and Copy of the IClipboardHelper implementations of these elements are no longer called, either.

  • The default tooltip of the ToolTipQueryEventArgs class is now set to null. Thus, the tooltip is not displayed when the event is handled without setting the tooltip content.
  • The properties RectangleIndicatorInstaller.Template and OrientedRectangleIndicatorInstaller.Template now return always the value that has been set by client code and are not modified by internal code anymore.
  • The GroupingSupport class no longer throws an ArgumentException if there is a node without associated ID. Instead the class uses the node itself as ID.
  • The HierarchicLayout class now uses a higher crossing cost for group node borders. To specify custom values, use the property HierarchicLayoutData.GroupBorderCrossingCosts.
  • If the master edge is clipped on the bounds of its source or target, the ParallelEdgeRouter class now always clips the associated parallel edges on that bounds, too.
  • The default value of the property GridNodePlacer.RootAlignment was changed to GridNodePlacer.BusAligned from RotatableNodePlacerBase.RootAlignment.Trailing.
  • Fixed a bug that prevented drag events from correctly reporting the changed modifier keys.

Minor Incompatible Changes

  • The method LayoutData.Apply is now protected instead of public.
  • The YList.SubList method was removed since it was not implemented at all and is not used by the library.
  • The clone methods of the geometric types Point, Rect, Size, and Insets was removed since these types are immutable and the methods just returned this.
  • The classes GeneralPath and GeneralPathCursor are now sealed.
  • The following changes regarding the expert API related to the EdgeRouter class were made:
    • The first parameter of the constructors in class SegmentInfoBase is now of type Object instead of Edge. The provided type should be either PathRequest for affected edges or Edge for non-affected, fixed ones. Furthermore, the property SegmentInfoBase.Edge has been removed as the info is not necessarily associated with an edge anymore.
    • Similarly, the first parameter of the constructor in class EdgeCellInfo is now of type Object instead of Edge. The provided type should be either PathRequest for affected edges or Edge for non-affected, fixed ones.
    • The constructor of class EdgeInfo now additionally takes a parameter of type Edge.
    • The parameter of type Edge from the constructor of Path as well as the respective property were removed. A path is now not necessarily associated with an edge but only with the newly introduced PathRequest.
    • The method PathSearchResult.GetEdgeInfo(Path) has been removed.