yFiles WPF Release Notes

Version 3.3 is the current major release of yFiles WPF. (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.3 - Changes Since 3.2.0.2

Hide Description
Open in yEd LiveDownload
yFiles WPF 3.3 Release Notes
New isometric graph editing support
yFiles WPF 3.3 Release Notes
New smart node aggregation algorithm
yFiles WPF 3.3 Release Notes
New support for Bezier edge paths

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.

If you are updating from an older version of yFiles WPF, have a look at the list of incompatible changes.

Major New Features

Isometric Drawing and Other Projections

CanvasControl (and thus GraphControl) now has an additional Projection property that can be used to transform the viewport into a different parallel projection, e.g. isometric or cabinet projection. Predefined useful projections are provided as constants on the new Projections class. Interaction, including graph editing, snapping, orthogonal edge editing, etc. still work as expected, just within the new projection. That is, orthogonal edge editing becomes isometric edge editing with an isometric projection. There is a corresponding chapter in the Developer's Guide that goes into further detail what has changed and which customization options exist.

The IsometricDrawing demo displays graphs in an isometric fashion to create an impression of a 3-dimensional view.

Fill Area Layout and Clear Area Layout

The new ClearAreaLayout algorithm clears a user-specified area in an existing layout by moving elements. It is suitable if the rest of the layout should not change much but some free space is required, e.g., because new elements need to be inserted into the drawing or have been resized.

The new FillAreaLayout algorithm fills a user-specified area in an existing layout by moving elements into or towards it. It can make layouts around the specified area more compact and is suitable if, e.g., elements were removed from the graph or their size has changed substantially.

A number of new demos showcase the new layout algorithms:

  • The new MarqueeClearArea demo shows how to make space in a diagram by dragging a marquee rectangle.
  • The new OverlapAvoidingEditor demo shows how to interactively edit graphs without creating overlaps.
  • The new ComponentDragAndDrop demo shows how to make space for components that you can drag from a palette onto the canvas.
  • The new FillAreaAfterDeletion demo shows how to fill free space after deleting nodes using the FillAreaLayout algorithm.
  • The new RelocateSubtree demo shows how to reuse free space after relocating a subtree to a new parent.

Aggregation and Analysis of (Large) Graphs

Many new algorithms for analyzing graphs are now included, for example to detect components and clusters, to aggregate sub-graphs, and to calculate centrality values. In addition, the analysis algorithms now have the option to define a subset of the graph to work on. In detail, the new classes are:

  • The new NodeAggregation class provides an algorithm that intelligently aggregates nodes of (large) input graphs. It does not require complex configuration and can be used without knowledge of specific clustering or aggregation techniques.
  • The KCoreComponents class provides a component detection algorithm that finds k-cores.
  • The classes LouvainModularityClustering and LabelPropagationClustering provide two new algorithms for cluster detection.
  • The EigenvectorCentrality class offers a centrality algorithm that measures the influence of a node in a network based on the Eigenvector score.
  • The PageRank class provides a centrality algorithm that calculates the so-called page rank for the nodes.
  • The classes ChainSubstructures, CliqueSubstructures, CycleSubstructures, StarSubstructures, and SubtreeSubstructures provide new algorithms that detect isolated substructures like chains, cliques, cycles, stars, or subtrees. This can be used as an input to other (layout) algorithms.
  • The class GraphStructureAnalyzer now offers additional methods to calculate the average degree, the average weighted degree, the diameter, and the density of a given graph.

The Large Graph Aggregation Demo shows how to use the NodeAggregation algorithm to automatically analyze and explore a large graph. Developers don't need to learn the academic details of the available clustering and centrality algorithms, but can simply configure their preferred aggregation sizes to automatically create perfect user-experiences in drill-down scenarios.

Support for curved edges

The new BezierEdgeStyle renders edges with smooth Bezier-curve paths.

In addition, the new edge label models BezierEdgePathLabelModel and BezierEdgeSegmentLabelModel place labels optimally on curved edges rendered with this style.

The BezierEdgeStyle demo demonstrates the use of the new BezierEdgeStyle and shows additional customizations to support various features in interactive editing. For example, for intuitive interactive editing, the edges are edited with the same control points -or handles- that are known from other vector graphic drawing applications.

Support for curved edges has been added to the layout and edge routing algorithms EdgeRouter and the CurveRoutingStage, and HierarchicLayout.

Interactive Node Resizing
Resizing nodes using their handles now supports two new behaviors:
  • Center resizing keeps the center fixed and scales the node in all directions. It is active when the NodeReshapeHandleProvider.CenterReshapeRecognizer is triggered which defaults to the Alt key held down.
  • Aspect ratio resizing maintains the aspect ratio of a node. It is active when the NodeReshapeHandleProvider.RatioReshapeRecognizer is triggered which defaults the Shift key held down.
  • The NodeReshapeHandleProvider.ReshapePolicy determines how the mouse location is interpreted when aspect ratio resizing is active.

The Reshape Handle Configuration Demo showcases these different resizing behaviors.

Related to this, the new Node Group Resizing Demo shows how to resize a selection of nodes en bloc. In contrast to the default behavior, this changes both the sizes and the locations of the nodes and not just the sizes.

Graph Builder
The new GraphBuilder, TreeBuilder, AdjacencyGraphBuilder have been added. These new classes facilitate building graphs from arbitrary data:
  • GraphBuilder can be used when the data consists of one or more collections of nodes, edges, and optionally, groups.
  • TreeBuilder can be used when the data consists of one or more collections of nodes, each of which knows its child nodes, and optionally, groups.
  • AdjacencyGraphBuilder can be used when the data consists of one or more collections of nodes, each of which knows its neighbors, and optionally, groups.

New Features

Viewer

  • The new NodeLabelModelStripeLabelModelAdapter class allows for using node label model parameters for the positioning of the row and column labels of a table.
  • Resizing nodes using their handles now supports keeping the node center and/or the aspect ratio of the node bounds.
    • Center resizing is active when the NodeReshapeHandleProvider.CenterReshapeRecognizer is triggered. The default is pressing the Alt key.
    • Aspect ratio resizing is active when the NodeReshapeHandleProvider.RatioReshapeRecognizer is triggered. The default is pressing the Shift key.
    • The NodeReshapeHandleProvider.ReshapePolicy property determines how the mouse location is interpreted when aspect ratio resizing is active.
  • Besides the CanvasControl.Projection property itself a number of new properties and methods have been added to support to transform the viewport into a different parallel projection:
    • CanvasControl has additional methods to convert between the world, the new intermediate, and the view coordinate system.
    • MarqueeSelectionInputMode, NavigationInputMode, and HandleInputMode now have a property UseViewCoordinates, which controls whether the input mode draws its decorations and processes input in view coordinates.
    • When MarqueeSelectionInputMode uses view coordinates, the resulting shape of the marquee in world coordinates may not be a rectangle. Therefore MarqueeSelectionEventArgs now has a Path property of type GeneralPath to describe the marquee shape and a UsePath property that determines whether the Path property or the Rectangle property shall be used.
    • EdgeDecorationInstaller, RectangleIndicatorInstaller, PointSelectionIndicatorInstaller, and DefaultPortCandidateDescriptor now have a property UseViewCoordinates that controls whether the decoration is rendered in view coordinates.
    • CreateEdgeInputMode's MeasureDistance method now has to return the distance in view coordinates iff CanvasControl's Projection is used.
    • IRenderContext now has additional members that are useful with the new projections feature: Projection, IntermediateTransform, WorldToIntermediateCoordinates, and IntermediateToViewCoordinates.
    • The methods EdgeSegmentControlEdgeStyleRenderer.Arrange, LabelControlLabelStyleRenderer.Arrange, and LabelStyleBase<TVisual>.ArrangeByLayout have an IRenderContext added as first argument.
    • A new Projection property has been added to ContextConfigurator and CanvasPrintDocument.

Analysis

  • A new component detection algorithm which finds k-cores has been made available using class KCoreComponents.
  • Centrality calculation algorithms which calculate the eigenvector centrality and page ranks for nodes have been made available using classes EigenvectorCentrality and PageRank, respectively.
  • The new analysis algorithm NodeAggregation supports an algorithm that tries to intelligently aggregate nodes of (large) input graphs and does not require that the user is familiar with specific clustering/aggregation algorithms.
  • New algorithms for detecting isolated substructures like chains, cliques, cycles, stars or subtrees have been made available via the classes ChainSubstructures, CliqueSubstructures, CycleSubstructures, StarSubstructures, and SubtreeSubstructures.
  • GraphStructureAnalyzer: added methods to calculate the average degree, the average weighted degree, the diameter and the density of a given graph.
  • New clustering detection algorithms using the Louvain Modularity and Label Propagation have been made available via classes LouvainModularityClustering and LabelPropagationClustering.
  • The analysis algorithms now have the option to define a subset of the graph to work on.

Algorithms

The features listed here are new features of the low level analysis algorithms. Most of them are reflected in new features of the analysis facade classes as listed in the section Analysis.

  • New methods compute several additional network statistics, namely GetAverageDegree, GetAverageWeightedDegree, GetDiameter, and GetDensity of class GraphChecker and GetModularity of class Groups.
  • Added class NodeAggregation which represents an algorithm that tries to intelligently aggregate nodes of (large) input graphs and does not require that the user is familiar with specific clustering/aggregation algorithms.
  • Added new method Transitivity.TransitiveEdges which creates the transitive edges that connect the visible nodes in an input graph.
  • Added method Groups.GetClusteringCoefficient that computes the local clustering coefficient for each node as well as the average clustering coefficient.
  • Added the new methods GraphConnectivity.KCore and GraphConnectivity.KCore(Graph, int that compute the so-called k-cores of an undirected input graph.
  • Added the new method Centrality.EigenvectorCentrality which computes the eigenvector centrality for each node in an undirected graph.
  • Added an implementation of the label propagation algorithm which detects communities in the input graph. See the new method Groups.LabelPropagation.
  • Added the new method Groups.LouvainModularity which detects the communities in the input graph by applying the well-known louvain modularity approach.
  • Added the new method Centrality.PageRank which provides an implementation of the page rank algorithm that computes a rank for each node.
  • The new Substructures class offers methods to detect the following graph structures: Chains, Cliques, Cycles, Stars, and Trees.

Layout

  • Added new property EdgeLayoutDescriptor.RoutingStyle that allows to specify the routing style individually for each edge routed by the EdgeRouter class. Furthermore, new properties MaximumOctilinearSegmentRatio and PreferredOctilinearSegmentLength on the descriptor provide means to configure the octilinear routing style.
  • The EdgeRouter class now supports a new routing style that generates curved edge paths. It can be specified for each edge individually using EdgeRoutingStyle.Curved.
  • Added new layout stage CurveRoutingStage. It replaces polyline edge paths with curved segments using cubic bezier splines and provides a generic way to produce layouts with curved edges.
  • Added the new routing style EdgeRoutingStyle.Curved to the HierarchicLayout class. The resulting edge paths consist of smooth curves that are constructed using cubic bezier splines.
  • The CircularLayout class now supports exterior edges that are routed around the exterior of the circle as smooth arcs, see the new property CircularLayout.EdgeRoutingPolicy.
  • Added new class EdgeBundlingStage that offers edge bundling for general undirected graphs. Bundling together multiple edges means that their common parts are to some degree merged into a bundled part. Edge bundling is useful to increase the readability of graph drawings with a high number of edges that connect a comparably small number of nodes.

Improvements

View

  • Substantially improved performance of removing visualizations. This can happen, e.g., when clearing a graph or deselecting elements.
  • Instances of the main geometry interfaces or value types can now be deconstructed into their components in C# 7 and later. This applies to IPoint, ISize, IRectangle, PointD, SizeD, RectD, and Tangent.
  • RectD is now implicitly convertible to Rect. This simplifies interaction with WPF in some places, e.g. when calling SetCanvasArrangeRect.
  • Conversion of an empty RectD to Rect now always results in Rect.Empty.
  • A new policy has been added to the ViewportLimiter which allows for zooming and panning towards the limits but not away from them. This prevents the viewport from "jumping" from out-of-limit coordinates into the limited bounds.
  • FitContent with an enabled ViewportLimiter now respects the LimitedFitContentZoom property on the CanvasControl.
  • GeneralPath.CreatePath now always creates a geometry for the path, even if the Pen and Brush passed to the method are null.
  • An Animation can now be paused and unpaused by setting the Paused Property on the Animator after the animation has started.
  • DefaultFolderNodeConverter and FoldingEdgeConverterBase: provide new protected methods CreatePreferredLabelSize to allow for overriding the default implementations.
  • The property GraphModelManager.ProvideUserObjectOnMainCanvasObject was added that can be set so that a model is accessible as its main canvas object's user object.
  • The extension method GetPathPoints was added for edges. The returned IListEnumerable contains the source port location, followed by the bend locations, followed by the target port location of an edge.
  • NodeStyleLabelStyleAdapter now propagates the label's tag to the node that's rendered with the node style.
  • NodeStylePortStyleAdapter now propagates the port's tag to the node that's rendered with the node style.
  • NodeStyleStripeStyleAdapter now propagates the stripe's tag to the node that's rendered with the node style.
  • CanvasControl.UpdateContentRect now throws an InvalidOperationException if an element on the canvas provided invalid (e.g. infinite) bounds.
  • ITable.AddLabel no longer accepts label model parameters that do not support IStripe instances. Previously node label models could be used, but did not work properly at runtime.
  • CompositeLabelModel: added support for label snapping.
  • PortControl: Width and Height are only updated when they have actually changed and are now ensured to be non-negative.
  • GraphModelManager: made methods Raise, Lower, ToFront and ToBack virtual.
  • Added the ability to the image export support (PixelImageExporter, XpsExporter, ContextConfigurator) to define an arbitrary list of points. The export chooses the exported area in a way that all these points are enclosed in the smallest possible rectangular area which is axis-parallel to the output coordinates.
  • Added the ability to the printing support (CanvasPrintDocument, CanvasControl.Print) to define an arbitrary list of points. The printed area is defined in a way that all these points are enclosed in the smallest possible rectangular area which is axis-parallel to the output coordinates.
  • XpsExporter now has a Background property which sets a Brush for a background color.

Input

  • GridVisualCreator now supports to only draw horizontal or only vertical lines when its GridStyle property is set to one of the new values HorizontalLines or VerticalLines.
  • Fixed a bug that caused artifacts when drawing the grid while panning.
  • GraphSnapContext.GridSnapDistance and GraphSnapContext.GridSnapType have been pulled up to SnapContext.
  • The zoom-invariant GridSnapDistance property has been added to CollectSnapResultsEventArgs.
  • The performance of the GridVisualCreator has been strongly improved.
  • An optional parameter preferredSnapType has been added to the SnapLineSnapResult constructor and the SnapResults.CreateSnapLineSnapResult factory method.
  • SnapResults.CreateResizeSnapResult now takes a PointD as delta parameter instead of a double so it is possible to create resize snap results where the orientation of the mouse delta differs from the orientation of the snapped size.
  • GraphClipboard and GraphEditorInputMode: added new event ElementsDuplicated that occurs when a duplicate operation finished successfully.
  • UndoEngine: The Undo and Redo methods now throw now InvalidOperationException if the current state does not allow performing Undo or Redo. Previously either NotSupportedException or Exception have been thrown.
  • The GraphEditorInputMode.RequeryHandles method has been made public and can now be used to refresh the displayed handles, if IHandleProvider implementations return different handles over time.
  • It is now easier to customize GroupingNodePositionHandler. The boolean properties AdjustParentNodeLayout, MoveChildNodes and ReparentingEnabled have been added to control whether ancestors' node layout should be adjusted when a node is moved, to not move the contents of a group node when a group node is moved or forbid any interactive reparenting.
  • The default position handler for edges now creates fewer additional bends when the edge is dragged while orthogonal edge editing is enabled.
  • A ReshapeHandlerDecorator property has been added to NodeDecorator to simplify using a custom IReshapeHandler implementation for nodes.
  • The property ReshapeRectangleContext.Ratio has been added that describes the width/height ratio that is kept for aspect ratio resizing.
  • The new classes NodeReshapeHandleProvider and NodeReshapeHandlerHandle are used as default implementation for node resize handles.
  • The factory method OrthogonalEdgeEditingContext.CreateOrthogonalEdgeDragHandler has been added and can be used for custom node position handler and reshape handler to keep orthogonal edges attached to a node orthogonal during the drag/reshape gesture.
  • A MaximumBoundingArea can now be set on ReshapeHandleProviderBase, ReshapeHandlerHandle, RectangleHandle and ReshapeRectangleContext to restrict reshaping to stay inside the given bounds.
  • ReshapeHandlerHandle: Getter for the IReshapeHandler and the HandlePositions have been added.
  • The property ReshapePolicy has been added to ReshapeRectangleContext so INodeReshapeSnapResultProvider implementations can respect the node aspect ratio for according resize gestures.
  • The new method PointD.Interpolate calculates the linear interpolation between two points.
  • Added a new method NavigationInputMode.FitContent that is called after collapse, expand, enter and exit operations if FitContentAfterGroupActions is enabled.
  • The NavigationInputMode class doesn't fit the content anymore after expand/collapse operations if an AutoGroupNodeAlignmentPolicy other then None is used.
  • ResizeStripeInputMode now has an IsDragging property, indicating whether a drag currently is in progress.
  • DropInputMode now has an IsDragging property, indicating whether a drag on the canvas currently is in progress.
  • HandleInputMode now has an IsDragging property, indicating whether a drag currently is in progress.
  • The new NavigationInputMode.FitContent method is called after collapse, expand, enter, and exit operations if the FitContentAfterGroupActions property is enabled.
  • The NavigationInputMode class doesn't fit the content anymore after expand and collapse operations if an AutoGroupNodeAlignmentPolicy other then None is used.

Analysis

  • Most of the algorithms in namespace Analysis provide properties SubgraphNodes and SubgraphEdges which facilitate to analyze only a subset of the given graph.
  • In a single node graph, the single node's closeness centrality and graph centrality value is now 1.0 (previously, it was infinity). This also affects derived values such as minimum, maximum, and normalized centrality. This change relates to yWorks.Analysis.GraphCentrality and yWorks.Analysis.ClosenessCentrality. The backing algorithms in yWorks.Algorithms.Centrality are unchanged.
  • GraphStructureAnalyzer: added methods to determine multiple edges.
  • The GraphCentrality and ClosenessCentrality analysis algorithms now calculate the centrality individually per component instead of returning a centrality value of 0.0 for nodes in graphs that are not connected.
  • EdgeBetweennessClustering: throws an InvalidOperationException if edge weights are not positive or finite.
  • FeedbackEdgeSet: throws an InvalidOperationException if edge weights are negative.

Layout

  • Constructor overloads have been added to SingleItem, ItemCollection, ItemMapping and ContextItemMapping that initialize one of their properties on construction.
  • Frequently used types of the layout part have now nullability annotations.
  • LayoutExecutor now generates more specific port constraints with FixPorts enabled, resulting in better edge paths.
  • HierarchicLayoutData.EdgeDirectedness: if the Mapper property is directly accessed (not explicitly set) its default for unset values is 1.0 (directed edge).
  • OrganicLayoutData.GroupNodeModes: if the Mapper property is directly accessed (not explicitly set) its default for unset values is GroupNodeMode.Normal. This doesn't change the result of the layout.
  • AspectRatioTreeLayoutData: RootPlacements, SubtreeRoutingPolicies, SubtreeAspectRatio: the type of the mapped values has been made nullable. For null or unset values now the settings on the AspectRatioTreeLayout will be taken as the documentation already stated.
  • Improved the support for early exits of the EdgeRouter class. The routing algorithm now often reacts more sensibly to the case that the specified MaximumDuration is reached.
  • The HideGroupStage class now offers a new property ResetEdgePaths that allows to specify whether or not the stage resets the path of edges incident to group nodes.
  • The ComponentLayout class now correctly considers node and edge labels when using the packed layout styles, e.g., ComponentArrangementStyles.PackedRectangle or ComponentArrangementStyles.PackedCircle. Previously, labels could overlap other elements when using these component arrangement styles.
  • Improved the consideration of the minimum edge to edge distance of the EdgeRouter class when it runs with highly restricted time (see EdgeRouter.MaximumDuration) or when it gets stopped by means of AbortHandler.
  • The PartialLayout class now produces more stable results if it is multiple times applied to the same input graph and property SubgraphPlacement is set to SubgraphPlacement.FromSketch.

New Demos and Demo Improvements

New Demos

  • The new AggregateGraphWrapper demo shows a graph which supports breaking down large graphs by hiding elements and adding substituted elements without modifying the original graph.
  • The new LargeGraphAggregation demo that shows how to use the smart NodeAggregation clustering algorithm together with an AggregateGraphWrapper for drill down exploration of a large graph.
  • The new BezierEdgeStyle demo demonstrates the use of the new BezierEdgeStyle and shows additional customizations to support various features in interactive editing.
  • The new NodeGroupResizing demo shows how to apply different resize behaviors to a set of nodes. For instance, the nodes will keep their size but their positions are altered according to the resize gesture applied to the entire group.
  • The new ZOrder demo shows how to persist the z-order during undo, clipboard operations, grouping, and saving and loading.
  • The new MarqueeClearArea demo shows how to make space in a diagram by dragging a marquee rectangle.
  • The new OverlapAvoidingEditor demo shows how to interactively edit graphs without creating overlaps.
  • The new ComponentDragAndDrop demo shows how to make space for components that you can drag from a palette onto the canvas.
  • The new FillAreaAfterDeletion demo shows how to fill free space after deleting nodes using the FillAreaLayout algorithm.
  • The new RelocateSubtree demo shows how to reuse free space after relocating a subtree to a new parent.
  • The new Sankey layout demo shows how HierarchicLayout can be configured to show a Sankey diagram.
  • The IsometricDrawing demo was added that displays graphs in an isometric fashion to create an impression of a 3-dimensional view.

Noteworthy Demo Improvements

  • The BPMN demo has been improved to provide more flexibility. Its code now can easier be used in custom projects.
  • Improved support for parsing the BPMN Diagramm Interchanged format.
  • The BPMN node styles now support setting colors.
  • The ReshapeHandleProvider demo now shows how to implement a custom IReshapeHandleProvider. The new ReshapeHandleProviderConfiguration demo shows how to configure the default IReshapeHandleProvider to modify the resizing behavior.
  • The LayoutStyles demo has been enhanced to include new layout features:
    • Exterior edge routing for CircularLayout.
    • Curved edge routing style for HierarchicLayout and Polyline EdgeRouter.
    • Bus routing for HierarchicLayout and Polyline EdgeRouter.
    • Integrated Edge Labeling for Polyline EdgeRouter.
  • GraphMLCompatibility: Added missing mappings and MarkupExtensions.

Bugfixes

View

  • Fixed a bug in FoldingManager where a predicate change in a FilteredGraphWrapper which serves as MasterGraph could trigger an exception if a child of a folder node has been hidden.
  • ICanvasObject.Above and Below don't unneccessarily trigger IRenderContext.VisualRemoved anymore.
  • Fixed a bug in LabelStyleDecorationInstaller that prevented a DefaultLabelStyle (or any other style rendering a DrawingVisual) from being used as decoration.
  • Fixed a bug that sometimes callbacks registered via IRenderContext.SetDisposeCallback have not been called when the visual was disposed.
  • Fixed the explict conversion between Transform and Matrix2D which was incorrect for Transforms with a rotation component.
  • SmartEdgeLabelModel: fixed a bug that caused a label with an angle other than 0 to jump when starting to move it interactively.
  • IFoldingView.Collapse and Expand now throw an ArgumentException when called with a node not belonging to the graph (instead of a NullReferenceException).
  • Fixed a bug which caused custom IEdgePathCropper implementations which are defined on custom port styles ignored if the graph is grouped.
  • Edges between deeper nested nodes are now displayed correctly in front of a common ancestor after that ancestor has been added or removed.
  • Fixed a bug which caused the ZoomToCurrentItem command to ignore the ViewportLimiter.
  • CanvasControl.ZoomTo no longer triggers two ViewportChanged events.
  • Fixed a bug in GraphCopier which caused the LabelCopied event to be dispatched twice for port labels on folder nodes.
  • Due to better null checks, several styles and input modes no longer throw an exception in the rare case that an IRenderContext doesn't provide a CanvasControl instance.
  • The GetStyle method of the NodeControl, PortControl, LabelControl, and EdgeSegmentControl classes no longer causes a NullReferenceException when an IRenderContext without a CanvasControl is passed.
  • Printing now uses the correct scale instead of being a bit too large. This means that 96 units in world coordinates are exactly one inch long in the printout.
  • GridVisualCreator now applies its Pen to all GridStyles.
  • GridVisualCreator now renders dots for GridStyle.Dots.
  • The ViewportAnimation no longer throws an Exception when applied on a zero-size GraphControl.

Input

  • TextEditorInputMode now correctly queries the ViewportLimiter if TextBoxPlacementPolicy.ScrollCanvas is used. If the text box is still not visible because it's outside the limited viewport, the text box will be moved as well.
  • TextEditorInputMode's TextBox no longer retains undo history from previous edits.
  • Fixed Undo/Redo of addition and removal of bends on folding edges. The bends now are correctly restored at the location they had at the time of removal.
  • TextboxEditorInputMode correctly rotates the textbox when Zoom is clamped.
  • Added missing visualization for HandleType.Default.
  • The NavigationInputMode.FitContentAfterGroupActions method is no longer ignored when the NavigationInputMode class is used as a child input mode of the GraphEditorInputMode class.
  • The NavigationInputMode class now also updates the CanvasControl.ContentRect property when it is not used as a child input mode of the GraphEditorInputMode class.
  • Fixed that GridVisualCreator ignored the grid origin when rendering lines or crosses.
  • Fixed bugs that interpreted SnapContext.GridSnapDistance or SnapContext.SnapDistance in world coordinates when calculating SnapResults.
  • Fixed pinch-zoom that stopped periodically during the gesture.
  • Orthogonal Edge Editing: fixed a bug that created bends in edges that are marked as not orthogonal.
  • OverviewInputMode: Fixed jumping of both client canvas and overview when scrollbar visibilty changes.
  • When zooming to the current item, changes in scrollbar visibility are properly incorporated into the new viewport position.
  • Scrolling the viewport with the mouse wheel no longer scrolls in the wrong direction if the mouse wheel is set to scroll one page at a time (instead of several lines).
  • Paste and duplicate operation now honor GraphEditorInputMode's ShouldSelect predicate.
  • Fixed a bug which could cause an input mode to be left in an undefined state if another input mode has been activated in an event handler of the first input mode. This usually resulted in the wrong cursor being displayed.
  • MouseWheelEventArgs are now set to Handled = true when CanvasControl scrolls or zooms to avoid those events from bubbling to parent controls.
  • The GraphControl.SetCurrentItemCommand command can now also be used to "reset" the current item to null by passing null as the command parameter. This also fixes that the NavigationInputMode.SetCurrentItem and GraphInputMode.SetCurrentItem methods did nothing when null was passed as an argument.
  • The NavigationInputMode.FitContentAfterGroupActions property is no longer ignored when the NavigationInputMode class is used as a child input mode of the GraphEditorInputMode class.
  • The NavigationInputMode class now also updates the CanvasControl.ContentRect property when it is not used as a child input mode of the GraphEditorInputMode class.

GraphML

  • GraphML can now handle enums with base type long.

Analysis

  • Fixed analysis class Chains for undirected cycles: if these cycles are not connected to other parts of the graph the Nodes collection of a resulting Path could be in an incorrect order.
  • yWorks.Analysis.EdgeBetweennessClustering no longer throws an exception with its default settings (MaximumClusterCount == -1).
  • The HierarchicalClustering class no longer throws an exception when applied to an empty graph.
  • ClosenessCentrality does no longer return NaN as NormalizedNodeCentrality if the graph consists of one single node. Instead, the NormalizedNodeCentrality will be positive infinity.
  • ClosenessCentrality.Run no longer throws an exception for unconnected graphs. Instead, all NodeCentrality and NormalizedNodeCentrality values will be 0 as the documentation states.

Layout

  • Fixed an exception in EdgeRouter which could occur in rare cases.
  • The OrganicLayout class no longer throws an exception when having a PartitionGrid and at the same time the scope set to Subset or MainlySubset where all nodes of the graph are marked as affected (could have used scope All instead).
  • Fixed method NodePlacerBase.PlaceSubtree(IDataProvider, IDataProvider, LayoutGraph, Node, ParentConnectorDirection) to clear its internal caches, especially the graph cached in field NodePlacerBase.graph. Previously, holding onto a node placer instance could lead to subtle memory leaks.
  • The EdgeRouter class no longer yields edge labels that overlap with unrelated group nodes when using the integrated label placement feature (EdgeRouter.IntegratedEdgeLabeling).
  • Resolved a bug in the EdgeRouter class which caused that grouped edges were sometimes actually not grouped together. This mainly appeared in conjunction with a large value of either the minimum first or last segment length.
  • The EdgeRouter class no longer produces an exception for some rare cases with fixed grouped edges and octilinear paths.
  • The HierarchicLayout class no longer throws an exception that was previously triggered in some cases with bus structures (see property HierarchicLayoutData.Buses) and in conjunction with layering constraints.
  • The EdgeRouter class now correctly observes inputs where the user specifies buses with both fixed and non-fixed edges at the same time.
  • The EdgeRouter class now properly considers ports provided by a PortCandidateSet when the set contains multiple candidates with single capacities and where the candidates are on the same node side. Previously, it could happen that only one of several edges connecting to the node correctly considered the ports.
  • The EdgeRouter class does no longer use the same fixed PortCandidate out of a specified PortCandidateSet if another non-saturated candidate can be chosen. Thus, overlapping edge segments are avoided.
  • The OrthogonalSegmentDistributionStage no longer produces degenerated (very large or small) coordinates for edges that contain zero-length segments, that is, duplicate edge path points.
  • The ChannelEdgeRouter class no longer yields degenerated routing results (very large or small coordinates) when using the OrthogonalPatternEdgeRouter as path finder strategy and setting its minimum distance to zero. The OrthogonalPatternEdgeRouter class now avoids duplicate points when the MinimumDistance property is set to zero.
  • The AspectRatioTreeLayout class no longer crashes, causing a stack overflow, when applied to a large chain graph.
  • Fixed a bug in the HierarchicLayout class that could cause unnecessary (double) edge crossings when the algorithm was executed in incremental layout mode with edge grouping and alternative group bounds.
  • The RecursiveGroupLayout class now correctly moves child nodes along with their group also in case the RecursiveGroupLayout.CoreLayout is null. Previously, if additionally a group node had a specific layout algorithm associated to it, the content was not correctly moved along. If the core layout was not null, the issue did not occur.
  • The EdgeRouter class now considers the correct shape of non-affected, fixed edges. Previously, it sometimes incorrectly parsed their shape which could lead to undesired effects like incorrect path cost calculation of affected edges.
  • The BalloonLayout class now longer crashes due to a stack overflow for inputs containing very long chain graphs.
  • Fixed a bug in the HierarchicLayout class that in some cases caused a violation of the minimum first or last segment length (EdgeLayoutDescriptor.MinimumFirstSegmentLength and EdgeLayoutDescriptor.MinimumLastSegmentLength). The bug was only triggered when the minimum length values were relatively large.
  • The TreeMapLayout class no longer produces results that may have infinite coordinates.
  • The EdgeRouter class no longer produces unnecessary overlaps for cases where the source or target node is overlapped by (several) label elements. This generally improves the ability of the router to deal with input that contains source/target nodes that are overlapped by other elements and are required to be crossed by an edge route.
  • The HierarchicLayout class no longer throws an exception that was previously triggered in some cases with bus structures (see property HierarchicLayoutData.Buses) and in conjunction with undirected edges (see HierarchicLayoutData.EdgeDirectedness).
  • A rare InvalidOperationException due to cross-thread access when running a layout in a separate thread now no longer occurs.
  • The MorphLayout and LayoutExecutor.Start methods no longer throw an Exception when applied on a zero-size GraphControl.
  • Fixed a bug in the EdgeRouter class that sometimes generated bad routing artifacts with edge grouping and when there were non-affected edges grouped at both end points.
  • The EdgeRouter class no longer throws an Exception that was previously in some cases triggered when the input contained bus edges (defined via BusDescriptor).

Incompatible Changes

API

  • The method CanvasControl.CreateInputModeContext is protected again, after having been made public accidentally previously.
  • The GraphEditorInputMode.RequeryHandles method is now public.
  • The HierarchicalClustering.Result.DendrogramRoot property can now return null if the result has been obtained from an empty graph.
  • The optional IPortLocationModelParameter and IPortStyle parameters of the IGraph.AddPort and GraphExtensions.AddPort methods can now be null.
  • The properties PixelImageExporter.Configurator and XpsExporter.Configurator are no longer virtual.
  • The ModelManager.UnInstall method has been renamed to the canonical name Uninstall.
  • LabelStyleBase<TVisual>.ArrangeByLayout now requires an IRenderContext instance as first parameter.
  • LabelControlLabelStyleRenderer.Arrange now requires an IRenderContext instance as first parameter.
  • EdgeSegmentControlEdgeStyleRenderer.Arrange now requires an IRenderContext instance as first parameter.
  • PixelImageExporter.Export: throws InvalidOperationException if the size of the image is empty.
  • XpsExporter.Export: throws InvalidOperationException if the width or height of the image is negative.
  • The NodeReshapeSnapResultProvider.GetSnapLines method now takes CollectSnapResultsEventArgs as additional parameter.
  • Several methods related to snapping now take a PointD instead of a double as delta parameter. In detail, these are SnapResults.CreateResizeSnapResult, NodeReshapeSnapResultProvider.AddSnaplineSnapResult, NodeReshapeSnapResultProvider.AddGridLineSnapResult, and NodeReshapeSnapResultProvider.AddSameSizeSnapResult.
  • The NavigationInputMode.FitContentAfterGroupActions property now is false by default.
  • The property BackColor on XpsExporter has been replaced with the Background property which now takes a Brush instead of a Color.

Behavior

  • The view coordinate system now includes the projection. For customers who do not use a projection, nothing will change. However, when the (old) view coordinate system has been used to render parts of the visualization in a zoom-invariant manner, the equivalent now is called the intermediate coordinate system. The view coordinate system is still necessary when coordinates relative to the control are needed, e.g. for tooltips or a context menu.
  • When using the new projections feature, CanvasControl's ContentRect property no longer has an effect on scrollbars or GraphControl.FitGraphBounds.
  • CanvasControl ignores its ViewportLimiter when projections are used.
  • Visuals that are rendered in view coordinates relative to the viewport may appear in a different location when exporting an image.
  • The GraphCentrality and ClosenessCentrality analysis algorithms now calculate the centrality individually per component instead of returning a centrality value of 0.0 for nodes in graphs that are not connected.
  • The NavigationInputMode.AdjustContentRect method doesn't fit the graph bounds in the viewport anymore.
  • The NavigationInputMode class doesn't fit the content after expand/collapse operations anymore. This can be re-enabled by setting the AutoGroupNodeAlignmentPolicy to a value other than None and FitContentAfterGroupActions to true.
  • The default value of the MoveViewportInputMode.PinchZoomThreshold property has been changed from 100 to 50 to prevent pinch gestures from stopping periodically.
  • The ViewportLimiter no longer jumps to the limited viewports if the current viewport is outside the limited area. This behavior can be restored by setting the ViewportLimiter.LimitingPolicy property to LimitingPolicy.Strict.
  • HierarchicLayoutData.EdgeDirectedness: If the Mapper property is directly accessed (not explicitly set), its default for unset values is now 1.0 instead of 0.0. These means that such edges are now treated as directed instead of undirected.
  • For the RootPlacements, SubtreeRoutingPolicies, and SubtreeAspectRatio properties of the AspectRatioTreeLayoutData class, the type of the mapped values has been made nullable. For null or unset values, the settings on the AspectRatioTreeLayout will now be taken. This is the documented behavior, though.
  • The value of the read-only property EdgeRouter.Partition is now null after applying the routing algorithm. It is only intended to be used during the execution. Previously, it was cached, even though the documentation stated otherwise.
  • The NavigationInputMode.AdjustContentRect method doesn't fit the graph bounds in the viewport anymore.
  • NavigationInputMode.FitContentAfterGroupActions now is false by default.
  • The NavigationInputMode class doesn't fit the content after expand and collapse operations anymore. This can be re-enabled by setting the AutoGroupNodeAlignmentPolicy to a value other than None and FitContentAfterGroupActions to true.
  • Conversion of an empty RectD to Rect now always results in Rect.Empty instead of a Rect with 0 width/height.

Deprecations

  • The properties EdgeRouter.PolylineRouting, EdgeRouter.PreferredPolylineSegmentLength and EdgeRouter.MaximumPolylineSegmentRatio are now deprecated. To enable polyline routing, specify EdgeRoutingStyle.Octilinear as routing style via EdgeLayoutDescriptor.RoutingStyle. The other two properties are also replaced by respective properties on the EdgeLayoutDescriptor class.