yFiles WPF Release Notes

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

Technical Requirements

  • Visual Studio 2010 or higher for software development with yFiles WPF.
  • Applications based on yFiles WPF require the Microsoft .NET Framework 4.0 runtime (or higher).
  • A browser to view the HTML documentation.
  • A Microsoft Windows operating system that supports the Windows Presentation Foundation.

yFiles WPF 3.1 - Changes Since

Hide Description
Open in yEd LiveDownload
yFiles WPF 3.1 Release Notes
New support for customizable rendering order
yFiles WPF 3.1 Release Notes
New support for lasso selection
yFiles WPF 3.1 Release Notes
New support for user-defined sub-components in hierarchic layouts

Major New Features

Labels at Ports
Labels can now be added to ports and the new label models FreePortLabelModel and InsideOutsideLabelModel can be used to place such labels. On the technical side, IPort now extends the ILabelOwner interface and the enum constant GraphItemTypes.PortLabel was added.
Customizable Rendering Order
Labels and ports can now optionally be rendered directly in front of their owner. Such a rendering order can make the ownership of labels and ports clearer if nodes overlap. Previously, all labels and ports were rendered in front of all nodes. The new rendering order can be enabled by setting the new properties LabelLayerPolicy and PortLayerPolicy of GraphModelManager to LabelLayerPolicy.AtOwner and PortLayerPolicy.AtOwner, respectively.

The nesting options of GraphModelManager for the visualizations of nodes and edges have been improved and clarified. The properties useHierarchicNodeNesting and useHierarchicEdgeNesting have been combined into the new hierarchicNestingPolicy property. It takes values of the new HierarchicNestingPolicy enum. Its new option HierarchicNestingPolicy.GroupNode configures GraphModelManager to visualize all leaf nodes in one canvas object group while nesting all group nodes depending on their hierarchical depth.

Drag and Drop
The new LabelDropInputMode and PortDropInputMode classes implement drag and drop for labels and ports, respectively. The API of these classes is similar to NodeDropInputMode for nodes.
Lasso Selection
The new LassoSelectionInputMode selects all model items inside a hand-drawn lasso region. This mode allows combinations of free-hand and straight-line sections during path creation.
Improved Orthogonal Layout
Many parts of the orthogonal layout algorithm have been significantly improved. In many cases, the drawings created by this algorithm are now much more compact and have smaller edge lengths, and they contain less crossings and perceived bends.

In addition, this layout now supports special layout styles of various substructures that are automatically detected in the input graph. Supported substructures are trees, chains and cycles. In addition to the style, the new feature offers more settings, like, for example, the desired tree layout orientation.

Parallel edges (multi-edges that share the same source and target node) are now routed as parallel as possible; if there are edge labels, the routes must differ somewhat. Previously, parallel edges were not handled explicitly and their routes were often very different, making the recognition of parallel structures difficult.

Sub-components in Hierarchic Layouts
In a hierarchic layout, you can now define sub-components of the input graph such that each sub-component is arranged by a user-specified layout algorithm. This allows hierarchical layouts where parts of the graph are arranged in a different fashion, e.g., to emphasize special sub-structures. The new HierarchicLayoutData.SubComponents property can be used to configure the new sub-components feature of the hierarchic layout.
Tree Map Layout
Added the new layout algorithm TreeMapLayout that generates tree maps. Tree maps present hierarchical data using nested rectangles (nodes) where each rectangle (node) gets its size depending on a specific dimension of data associated to it. The new TreeMapLayoutData class provides additional configuration options for this algorithm.
Tabular Layout Style
The new layout algorithm TabularLayout generates simple tabular arrangements of nodes. It allows to place nodes in rows and columns, such that each table cell contains at most one node. Among its features is, for example, a from-sketch mode, the possibility to exactly map nodes to specific cells or different vertical and horizontal alignments. The new TabularLayoutData class provides additional configuration options for this algorithm.

New Features


  • The following types and methods were added to support the new LassoSelectionInputMode.
    • Added the GraphInputMode.LassoSelectionInputMode property and a corresponding factory method. LassoSelectionInputMode is disabled per default.
    • The new GraphInputMode.LassoSelect method programmatically selects all items in the provided GeneralPath.
    • The new ILassoTestable interface specifies whether the item is considered to be inside the lasso path. This is analog to the IMarqueeTestable interface for marquee selection.
    • Any model item can be decorated with an instance of ILassoTestable or provide one in its lookup. For this, the Node/Edge/Port/Label/BendDecorator classes got the new LassoTestableDecorator property for decorating an item with a custom ILassoTestable.
    • The new IsInPath method of Node/Edge/Port/LabelStyleBase can be overridden to customize the lasso testing behavior.
  • With TableEditorInputMode, double clicking a stripe or stripe label now edits the label in the same way as for other graph items.
  • RectD and SizeD: Added methods to reduce the size of an RectD and SizeD instance, respectively.
  • The new static methods PositionHandlers.Combine combines multiple position handler instances into a single instance.
  • Added the events ElementsCopied, ElementsCut, and ElementsPasted to GraphEditorInputMode, and the event ElementsCopied to GraphViewerInputMode.
  • The new Animations.CreateSequentialAnimation method creates an animation that animates multiple animations in sequence.
  • The rectangle of the marquee selection can now be customized with the new protected method MarqueeSelectionInputModes.CalculateMarqueeRectangle.
  • Added new decorator implementations for table items. You can access these new decorators via the new method ITable.GetDecorator with the RowDecorator, ColumnDecorator and StripeLabelDecorator properties.
  • If the new CanvasControl.QuantizeInputCoordinates property is enabled, world coordinates of mouse and touch events are rounded to nicer values to avoid unnecessary precision. For example, you'll get the value 326.375 instead of 326.3858109495. The rounding is chosen based on the zoom level to ensure that there is almost no visual deviation. Lower zoom levels will result in coarser rounding, higher zoom levels will use exactly as much precision as necessary. By default, this option is enabled.


  • Added the TreeMapLayoutData configuration class for the new TreeMapLayout algorithm.
  • Added the TabularLayoutData configuration class for the new TabularLayout algorithm.
  • Added the TemporaryGroupNodeInsertionData configuration class for the new TemporaryGroupNodeInsertionStage layout stage.
  • The new HierarchicLayoutData.SubComponents property can be used to configure the new sub-components feature of the hierarchic layout.
  • The new TreeLayoutData.CompactNodePlacerStrategyMementos property can be used to to maintain similar layout styles over subsequent runs of compact tree layout.
  • ShortestPaths: Added a-star (A*) algorithm for finding the shortest path between two nodes in a directed or undirected, arbitrary graph.
  • The new property OrthogonalLayout.MaximumDuration controls the preferred time limit of this layout algorithm.
  • The new OrthogonalLayout.UniformPortAssignment property allows to obtain results with a more uniform port assignment.
  • TreeLayout: Added node placer CompactNodePlacer that produces more compact tree layouts. It uses a dynamic optimization approach that chooses a placement strategy of the children such that the overall result is compact with respect to a specified aspect ratio, see property CompactNodePlacer.PreferredAspectRatio.
  • The new TreeLayoutData.CompactNodePlacerStrategyMementos property can be used to to maintain similar layout styles over subsequent runs of compact tree layout.
  • EdgeRouter now supports routing through user-specified intermediate points. All specified points will lie on the edge route in the given order. See new property EdgeLayoutDescriptor.IntermediateRoutingPoints.
  • EdgeRouter: Edges that connect group nodes with their descendants can now directly connect from the inside to the group node border. Previously, an edge needed to always leave the group node before connecting to it. The feature can be enabled/disabled individually for each edge using the new property EdgeLayoutDescriptor.DirectGroupContentEdgeRouting.
  • Added convenience layout stage TemporaryGroupNodesInsertionStage that automatically generates a (non-nested) grouping structure from a given mapping of nodes to a component ID. This temporary grouping is meant for use during the run of the core layout algorithm of the stage. It allows, for example, easy use of RecursiveGroupLayout without the need for a real grouping structure when the requirement is that different sub-graphs need to be arranged with different layout algorithms.

    The new TemporaryGroupNodeInsertionData class provides additional configuration options for this algorithm.

  • The new stage PlaceNodesAtBarycenterStage places a user-specified subset of nodes on the barycenter of their neighbors. During the core layout, these node are hidden.



  • The PointD.ToMutablePoint and RectD.ToMutableRectangle methods now return a MutablePoint instead of IMutablePoint and a MutableRectangle instead of a IMutableRectangle, respectively.
  • The new method GeneralPath.Intersects(GeneralPath) determines whether the path intersects with another GeneralPath.
  • When reading GraphML with the deserialization property IgnoreXamlDeserializationErrors enabled, invalid property content is now skipped instead of discarding the whole object with such content.


  • Many label model CreateParameter methods now have default values for parameters that are not needed every time.
  • InteriorStretchLabelModel: Added new parameters CenterHorizontal and CenterVertical for horizontal or vertical centered one-line labels.
  • The ElementCopiedCallback parameter of the methods GraphCopier.Copy and GraphClipboard.Duplicate is now optional (and can be null).
  • Added a Remove method to NodeDecorator, LabelDecorator, EdgeDecorator, PortDecorator, and BendDecorator for easy removal of decorations.
  • GraphSource now supports edges to and from group nodes.
  • GraphSource now supports parent-child relationships between nodes definded in NodesSource when no GroupsSource is set. The parent node of such a relation is converted to a group node and uses the GroupNodeControlStyle.
  • The default value of DefaultPortCandidate.LocationParameter is now FreeNodePortLocationModel.NodeCenterAnchored for nodes and BendAnchoredPortLocationModel.FirstBend for edges instead of a parameter of an internal model.
  • DefaultGraph has new factory methods to customize undo unit creation.


  • Added the new CanvasControl.LimitFitContentZoom property which controls whether the maximum zoom level for the CanvasControl.FitContent method as well as the FitContent command is restricted to 1 or the value of the MaximumZoom property.
  • Two-finger panning and zooming has been improved and no longer changes the viewport in unexpected ways.
  • The new method GraphModelManager.GetMainCanvasObject returns the canvas object that should be used when changing the visibility or z-order of a model item.
  • The ComponentCommands.ScrollPage commands now accept any IConvertible command parameter instead of only doubles and strings.
  • Akin to the two CanvasControl.ZoomTo methods, there are now two CanvasControl.ZoomToAnimated methods that animate the viewport change.
  • Assigning a new graph instance to GraphOverViewControl now keeps configuration changes made to the overview's VisualCreator instance.
  • Selfloop edges are now properly displayed in the GraphOverviewControl.
  • Animations after a layout don't break anymore if the graph is modified concurrently.
  • ICanvasObjectGroup.AddChild(Object,ICanvasObjectDescriptor): The second parameter is now a default parameter with default value null and therefore changed its attribute to CanBeNull. If no descriptor is passed, CanvasObjectDescriptors.AlwaysDirtyInstance is used by the default implementation.
  • GraphModelManager now avoids unnecessary re-installation of items if they keep their ICanvasObjectGroup. By these re-installations the z-order of the item in its group was lost and a new visual was created.


  • The CanvasControl.CreateInputModeContext method is now public instead of protected.
  • GraphEditorInputMode and TableEditorInputMode: Method EditLabel now also returns a Future, similar to AddLabel and CreateLabel.
  • The INode parameter of the NavigationInputMode.EnterGroup method is now optional. If it is omitted or null the whole graph will be revealed.
  • The new properties MoveViewportInputMode.SnapPanning and SnapPanningThreshold allow for snapping touch panning to one axis.
  • Moving a node with the MoveInputMode for unselected nodes now moves the bends of adjacent self-loops, too.
  • The new methods FindNextItem and FindNearestItem of NavigationInputMode can be used to configure the determination of the "next" item.
  • The type parameter T of class ItemDropInputMode<T> is no longer restricted to IModelItem.
  • The following input modes now release the mutex before dispatching their final event:
    • CreateEdgeInputMode now releases the mutex before dispatching the EdgeCreated event.
    • MoveInputMode now releases the mutex before dispatching the DragFinished event.
    • ResizeStripeInputMode now releases the mutex before dispatching the DragFinished event.
  • CreateEdgeInputMode now removes coinciding bends if orthogonal edge creation is enabled.
  • The new CreateEdgeInputMode.GetSourcePortCandidates protected method makes source port candidate determination more flexible.
  • The new optional parameter initialTargetLocation of the CreateEdgeInputMode.DoStartEdgeCreation method can be used to define the initial location that shall be used to find a target node.
  • During interactive edge creation, the tip of a newly created edge now only snaps to valid target port candidates to create orthogonal end segments.
  • CreateEdgeInputMode now always creates dummy ports during a gesture, instead of temporarily reusing real ports if available. This makes it possible to change, e.g. the dummy edge's source port's style during the gesture.
  • The new CreateEdgeInputMode.StartOverCandidateOnly property can be used to restrict the start of an edge creation gesture to directly hovered port candidates.
  • The new TextEditorInputMode.TextBoxPlacementPolicy property provides finer control of what happens when the TextBox is (partially) outside of the viewport.
  • The new TextEditorInputMode.TextBoxPadding property controls the padding between the TextBox and the border of the canvas.
  • The CanvasControl.Mouse2DClicked event now reports the position of the mouse down event as its location, and the CanvasControl.Touch2DTapped event reports the location of the touch down event as its location. Previously, this was the location of the up events which can be slightly different.
  • The properties MaximumSnapDistance, ShowHitPortOwnerCandidatesOnly and Visualization have been added to PortRelocationHandleProvider and are applied to each PortRelocationHandle created by this provider.
  • Added overridable methods to PortRelocationHandle to allow customization of the port candidates.
  • The new PortRelocationHandle.Visualization property controls how the preview during edge reconnection is handled. A new option is to change the edge during the gesture, which improves fidelity of the preview in certain cases.
  • The new optional content parameter of the MouseHoverInputMode.Show method defines the content of the tool tip to show. Now, the GetToolTipContent method only gets called if no content was specified.
  • The events ItemTapped, ItemDoubleTapped, and CanvasTapped have been added to GraphInputMode.
  • The new TapEventArgs.TapCount property can be used to distinguish between single and multiple taps.
  • The static constants SelectedMovablesPositionHandler and SelectedMovablesHitTestable have been added to GraphEditorInputMode. These are used as default PositionHandler and HitTestable properties of GraphEditorInputMode.MoveInputMode and can be reused for other input modes.
  • Introduced new property HandleMissingMouseEvents on CanvasControl which allows for configurable handling of mouse gestures which are only received partially.


  • PolylineEdgeStyle renders better looking paths for self loop edges whose ports are near the node border.
  • NodeControl, LabelControl, PortControl, EdgeSegmentControl, and StripeControl now can swallow mouse and touch up events which don't have a preceeding down event.
  • Improved explicit measuring with NodeControlNodeStyle.GetPreferredSize, LabelControlLabelStyle.GetPreferredSize and PortControlPortStyle.GetPreferredSize when implicit styling is used.


  • The last parameter of the following extension methods of ITable is now optional: FindRow, FindColumn, FindStripe, and FindStripes.
  • TableEditorInputMode now handles clicks and taps similar to GraphEditorInputMode:
    • New ItemClicked, ItemLeftClicked, ItemRightClicked, ItemDoubleClicked, ItemLeftDoubleClicked, ItemRightDoubleClicked, ItemTapped, ItemDoubleTapped events are raised.
    • If an event is handled, its default behavior is prevented.
    • The new properties ClickableItems and ClickableRegions determine for which items and regions a click or tap event will be raised.


  • Fixed freezes in redrawing upon continuous input gestures which could occasionally occur with very large graphs.
  • Dramatically improved performance of selection decoration rendering for nodes and labels, especially in large graphs.
  • Improved performance of selection rendering, especially in large graphs.
  • Improved performance for ICanvasContext.ToWorldCoordinates.
  • Improved performance of VisualGroup in very large visual trees.
  • The performance of FilteredGraphWrapper has been improved. Now, it depends mainly on the size of the resulting filtered graph. This allows for loading very large graphs into memory and displaying only a subset of them using FilteredGraphWrapper.


  • The new LayoutExecutor.CreateLayoutGraphAdapter callback method makes it possible to configure the LayoutGraphAdapter that is used for the layout calculation.
  • The new TreeLayoutData.CriticalEdgePriorities property can be used to specify critical edges.
  • SmartEdgeLabelModel now is properly handled by labeling algorithms, resulting in better label placements.
  • The new ImprovePortAssignment property of LayoutExecutor and LayoutGraphAdapter enables PortCalculator to improve the port assignment.
  • The combination of PartitionGridData and TableLayoutConfigurator has been improved:
    • PartitionGridData now reuses the PartitionGrid created by the TableLayoutConfigurator.
    • Several methods have been added to TableLayoutConfigurator which provide access to the PartitionCellId assignment of the configurator as well as the mappings between IRow/IColumn and RowDescriptor/ColumnDescriptor.
  • Major performance improvement for EdgeRouter in routing scenarios where it is unavoidable to cross obstacles (e.g. other nodes or labels) in order to reach the target. This includes cases where a crossing is necessary to guarantee that port candidates/constraints at the target side are satisfied.

    In addition, several minor performance improvements reduce the runtime of the path search phase as well as the segment location assignment phase.

  • EdgeRouter: Improved quality in maze routing scenarios. Previously, it could happen that edge-node overlaps occurred even though there exists a more complicated path that yields no overlaps.
  • BusRouter: Now automatically ignores non-orthogonal edges with fixed bus descriptor (see BusDescriptor.Fixed) or transforms them into orthogonal edges if they are octilinear. In previous versions, the layout algorithm simply throws an error in such cases.
  • MultiPageLayout: Improved runtime as well as layout quality if the input is a tree structure and the specified CoreLayout is either an instance of class TreeLayout or ClassicTreeLayout. Furthermore, property MultiPageLayout.AdditionalParentCount allows to specify the number of additional proxies that the algorithm tries to add to a subtree. The original nodes associated with these proxies lie on the path of the tree's root to the subtree placed on a page.
  • MultiPageLayout: Added property CreateProxyReferenceNodes that allows to disable the creation of proxy reference nodes as well as property MultipleComponentsOnSinglePage that allows to prevent that elements of different connected components are placed on the same page.
  • PortPlacementStage now additionally considers port grouping constraints. If two edges are port-grouped at a certain node, the stage assigns the same port location to the edges. Port groups are marked using DataProviders registered with PortConstraintKeys.SourcePortGroupIdDpKey and PortConstraintKeys.TargetPortGroupIdDpKey.
  • TreeComponentLayout: Added property ConsiderUndirectedTreesthat allows to specify whether or not undirected tree structures should be handled or not. Previously, only directed tree structures were considered.
  • DefaultNodePlacer and SimpleNodePlacer now both support to specify a minimum distance between the edge segments that are routed orthogonally in the channel between the root node and the child nodes, see method DefaultNodePlacer.MinimumChannelSegmentDistance and SimpleNodePlacer.MinimumChannelSegmentDistance respectively.
  • ClassicTreeLayout now allows to specify a minimum vertical distance for the horizontal edge segments of the bus, see ClassicTreeLayout.MinimumBusSegmentDistance.
  • The new properties LayerConstraints and SequenceConstraints of HierarchicLayoutData can be used to configure layer and sequence constraints for the HierarchicLayout. These supersede the previous LayerConstraintFactory and SequenceConstraintFactory properties.
  • OrthogonalLayout: Reduced the number of bends of directed edges.
  • The EdgeRouter class now calculates a better routing for edges between group nodes and their descendants in the case that the routing is aborted via AbortHandler or when the maximum duration time limit is up. Previously, such edges might not have been handled in this case, whereas now they always get a simple but valid orthogonal route.
  • The HierarchicLayout class now respects the sequence and layering constraints between subcomponents. Previously, such constraints were ignored.
  • Added PlaceNodesAtBarycenterStageData which allows to conveniently define the affected nodes that should be affected by PlaceNodesAtBarycenterStage.
  • The HierarchicLayout now requires less memory for graphs with sequence constraints.
  • The HierarchicLayout no longer inserts superfluous bends for edges between group nodes if the input graph contains grouped edges.


Graph and View

  • Fixed repaint errors that could occur when many elements where selected and scrollbars changed their visibility.
  • Fixed performance regression caused by too large dirty regions.
  • Fixed non-linear performance with handles when deselecting a large number of nodes.
  • Reduced memory consumption of DefaultEdgePathCropper.
  • Fixed a bug that sometimes that a mouse move is detected instead of a mouse drag.
  • The Mouse2DEventTypes.Entered event now provides the correct coordinates.
  • Fixed a bug that sometimes prevented dispatching the mouse up event.
  • Fixed an exception when an edge or label is pasted without selected target while its original owner is not in the current view.
  • PolylineEdgeStyle now takes arrow heads into account for visibility checks.
  • To distinguish touch move events from touch press events, the CanvasControl.LongPressTime property was used instead of the CanvasControl.DragTime property.
  • Removing an item that is currently highlighted with a custom HighlightIndicatorManager, FocusIndicatorManager, or SelectionIndicatorManager no longer results in a NullReferenceException.
  • The extension method OrientedRectangleExtensions.GetCenter didn't return the correct center if the width or height of the rectangle was equal to 0.
  • The HitTestRadius property of the following implementations of ICanvasContext now correctly contain the value in world coordinates instead of view coordinates:
    • The context created by Contexts.CreateCanvasContext when passing a CanvasControl but no hit test radius.
    • The context passed to DisposeVisualCallback.
    • The context passed to IPositionHandlers by MoveInputMode.
    • The context passed to adjacent handles when moving a bend handle.
  • The InteriorStretchLabelModel.GetMinimumNodeSize method now uses the correct insets for width calculation. Previously the top insets were erroneously used for the width.
  • Sometimes, the GroupNodeDefaults.Labels.AutoAdjustPreferredSize property and the GroupNodeDefaults.Ports.AutoCleanup property were not considered for labels and ports of groups.
  • Panning with two fingers held down does no longer change the zoom level.
  • The ApplicationCommands.Copy command is no longer executed twice.
  • The methods GraphClipboard.Copy and GraphClipboard.Cut don't copy items anymore which depend on items that are selected but not included in GraphClipboard.CopyItems.
  • Snap lines which indicate the same size are no longer shown for implicitly re-sized parent group nodes.
  • The validation schema for GraphML has been fixed to work with more validators.
  • FreeEdgeLabelModel: Static property Instance is now excluded from obfuscation.
  • The graph of an IFoldingView now raises the NodeCreated, EdgeCreated, PortAdded, LabelAdded, and BendAdded events after the created element is registered. This fixes a bug where the master item of the created item was not available in handlers for these events.
  • Fixed wrong types of exceptions:
    • GraphMLIOHandler: The methods OnQueryName and OnQueryType now throw an ArgumentNullException instead of a NullReferenceException when one of the arguments is null.
    • Table: The methods SetLabelText, Remove, SetLabelPreferredSize and SetLabelLayoutParameter now throw an ArgumentException instead of an InvalidOperationException.
  • Undo units created by the execution of a layout algorithm are now correctly merged with undo units of the previously executed interactive gesture.
  • The default implementation of IPortSnapResultProvider never returned any snap results.
  • Corrected weird scrolling behavior of the scroll bar when the viewport was outside the content rectangle.
  • DefaultGraph now calls the OnRemovingEdge and OnRemovingPort methods before their incident items are removed.
  • The commands Copy, Cut, and Duplicate are no longer enabled if there are no elements to cut, copy, or duplicate.
  • The GroupingSupport.HasGroupNodes method now returns only true if there are actually group nodes in the graph. Previously, it returned also true if there once were group nodes which had been removed in the meantime.
  • BevelNodeStyleRenderer, PanelNodeStyleRenderer, ShadowNodeStyleDecorator and ShinyPlateNodeStyleRenderer now consider the shadow in their IsVisible and GetBounds methods.
  • Running Code Analysis on applications using yFiles WPF no longer crashes FxCop.
  • Bridges: For edges which cross each other with the same absolute slope now a bridge is added on exactly one of these edges, depending on the crossing policy (was: either on both edges or none of them).
  • GraphModelManager: Fixed NullReferenceException that occured when any of the Descriptor properties were set while the GraphModelManager instance was not yet associated to an IGraph.
  • The PreferredPlacementDescriptor.Equals method incorrectly reported instances with different angles and distances as equal.
  • SmartEdgeLabelModel centered all labels on the their edge that overlapped with a segment of the edge or were placed directly next to it.
  • GenericLabelModel serialization: Fixed cyclic reference in GraphML which could happen while serializing a GenericLabelModel with a parameter with associated descriptor.
  • GraphClipboard: The contents of a folder node was not copied if the folder was copied from within a group view, i.e. if the user entered a group node. In the worst case, this might have frozen the complete application.
  • Corrected the GraphML serialization of IArrow instances that were created with the Arrow.GetAsFrozen method.
  • Fixed a regression where snap line visualizations could cause an exception from within WPF in reconnected Remote Desktop sessions.


  • Fixed possible NullReferenceException when TextEditorInputMode was uninstalled directly after starting an edit.
  • ClickInputMode provided wrong click locations in the Clicked event if a Mouse2DEventTypes.Clicked event without preceding Mouse2DEventTypes.Pressed event was processed.
  • CreateEdgeInputMode and CreateBendInputMode now cancel on LostCaptureDuringDrag event.
  • CreateEdgeInputMode did not show port candidates after re-installation of the input mode.
  • Moving an edge label with SmartEdgeLabelModel that is owned by an edge without visible path no longer throws an exception.
  • ItemHoverInputMode now resets the hovered item when moving the mouse out of the control.
  • GraphEditorInputMode and GraphViewerInputMode no longer ignore changes to their sub-input modes after having been installed once.
  • Disabling MarqueeSelectionInputMode during the gesture via code left the marquee visible on the screen.
  • While relocating edges, dropping a port over an invalid target or empty canvas no longer creates an empty undo unit.
  • The Clicked and DoubleClicked events of ClickInputMode were sometimes missing when clicking on a node or edge. Now, they are always triggered unless the event was handled before.
  • TextEditorInputMode: Inserting a line break now replaces selected text.
  • Node-to-edge snapping is now disabled by default which is the documented and intended value. For this, the initial value of the GraphSnapContext.NodeToEdgeDistance property is set to -1.0.
  • The LabelEditingEventArgs.Context.ParentInputMode property provided in the events GraphEditorInputMode.LabelAdding, GraphEditorInputMode.LabelEditing, TableEditorInputMode.LabelAdding and TableEditorInputMode.LabelEditing now contains the corresponding GraphEditorInputMode or TableEditorInputMode instance.
  • The CreateEdgeInputMode.CancelGestureOnInvalidTarget property was sometimes ignored on touch-enabled devices.
  • CreateEdgeInputMode: The ValidBeginCursor is now correctly hidden during edge creation when bend creation isn't allowed.
  • The KeyEventRecognizers ShiftPressed, AltPressed and CtrlPressed now also recognize the modifier if the event has Touch2DEventArgs.
  • The following event recognizer of input modes and input-related classes can now also be used with touch gestures:
    • CreateBendInputMode.SplitOrthogonalSegmentRecognizer.
    • DragStripeBordersInputMode.ResizeNeighborsRecognizer and IgnoreContentRecognizer.
    • CreateEdgeInputMode.PortCandidateResolutionRecognizer and EnforceBendCreationRecognizer.
    • GraphInputMode.MultiSelectionRecognizer.
    • TableEditorInputMode.MultiSelectionRecognizer.
    • ReparentNodeHandler.ReparentRecognizer.
    • PortRelocationHandle.PortCandidateResolutionRecognizer.
  • CreateEdgeInputMode didn't always update the highlight of possible source port candidates when its ShowPortCandidates property was configured to show the source port candidates.
  • Switching the input mode in an event handler of the current input mode no longer throws an exception.
  • ItemHoverInputMode updates the hovered item upon mouse drag events, too. This is the documented behavior. Previously, the hovered item was only updated on mouse move events.
  • ItemHoverInputMode removes the hovered item upon Cancel.
  • The ParentInputMode property of the InputModeEventArgs now is the input mode which has raised the event. Previously, some input modes erroneously set the ParentInputMode to the containing GraphEditorInputMode or GraphViewerInputMode.


  • When a stripe is removed, ITable.LabelRemoved events for the implicitly removed associated labels are now raised, too.
  • When a selected stripe label is edited its TextBox now is correctly placed.
  • Selected stripe labels no longer remain selected after their owning stripe is deleted.
  • Selected stripe labels no longer cause exceptions when hovering over them.
  • The selection indicator for selected stripe labels is now shown correctly.


  • OrthogonalLayout now considers edge grouping also if there are no directed edges specified.
  • In EdgeRouter, an error occurred when there were intermediate routing points and the path search got aborted (e.g. because of maximum duration time limit).
  • In ShortestPaths, an error occurred when the a-star algorithm was applied to a graph with non-monotonic heuristic costs.
  • In HierarchicLayout, an error was triggered when a yWorks.Algorithms.Util.DataProviderAdapter that does not override the DataProvider.get method was registered with key GivenLayersLayerer.LayerIdDpKey. This issue only appeared in conjunction with subcomponents.
  • The HierarchicLayout now produces less bends if the edges should be routed on a grid and the grid reference point is not (0,0), see NodeLayoutDescriptor.GridReference.
  • HierarchicLayout did sometimes not correctly consider the edge thickness for grouped edge segments. Even though there would have been space for a thick edge it was placed too close to other elements.
  • HierarchicLayout now produces more symmetric results for grouped edges if property SimplexNodePlacer.BarycenterMode is enabled.
  • Fixed a rare bug in OrthogonalLayout that may have caused infinite looping for grouped input graphs.
  • For some input graphs the OrganicLayout produced an error if the CycleSubstructureStyle property was set to CycleSubstructureStyle.Circular.
  • CircularLayout does now correctly consider the EdgeBundleDescriptor.Bundled property for edges between different partitions. Previously, when at least one of these edges had the Bundled property enabled, all of them were bundled, ignoring the property value of the other edges.
  • Fixed a bug in TreeMapLayout that may have caused NaN-coordinates or infinite looping for input graphs that are non-directed trees.
  • For grouped segments the GraphLayoutLineWrapper now produces more compact results.
  • In rare cases the GraphLayoutLineWrapper produced drawings with large empty space between lines.
  • HierarchicLayout: Fixed problem that sometimes caused an unnecessarily large distance between adjacent layers.
  • The MultiPageLayout now correctly considers the maximum page size for tree layouts.
  • TabularLayout no longer crashes when applying an instance of it to a single-node graph after that same instance was previously applied to a larger graph.
  • HierarchicLayout now correctly considers fixed nodes with layering constraints. In previous versions there were some rare cases where such inputs caused infinite looping issues.
  • GenericLabeling now always prefers LabelCandidates with higher profit values over others with lower profit (see LabelingBase.GetProfit). Previously, this sometimes happened even though both candidates did not intersect with other elements.
  • GenericLabeling does no longer assume 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.
  • The EdgeRouter now always considers the PortCandidates for edges grouped with fixed edges.
  • The EdgeRouter now keeps collinear bends of fixed edges.
  • The FamilyTreeLayout now correctly considers the preferred family member order.
  • OrthogonalLayout does no longer throw an exception for some input graphs when property SubtreeStyle is set to Compact and ChainStyle is set to a wrapped style.
  • OrthogonalLayout no longer throws exceptions if property CycleStyle is set to a specific style and the input graph only consists of a single cycle.
  • BusRouter does no longer produce non-deterministic results, i.e. different results for consecutive runs on the same input. Previously, this was possible in rare cases.
  • EdgeRouter does no longer crash when defining exactly two equal intermediate routing points for an edge.

Incompatible Changes

Incompatible API Changes

  • ReparentStripePositionHandler: All callback methods dealing with ghost objects have been renamed consistently:
    • UpdateXyzVisualisation to UpdateXyzGhost.
    • UpdateTargetVisualizationBounds to UpdateTargetGhostBounds.
  • The protected factory method MoveLabelInputMode.CreateLabelHitTestable has been removed. Developers who want to set a custom instance need to set it directly to the HitTestable property.
  • The CanvasComponent.AnimateScrollTo method has been removed and is superseded by the new ZoomToAnimated methods.
  • The AnchoredPortLocationModelExtension class has been moved to the GraphML compatibility demo where it was really needed.
  • The GraphInputMode.CanvasClicked event now provides the GraphEditorInputMode or the GraphViewerInputMode as parent input mode in the Context property of its ClickEventArgs.
  • The ITable.RelativeLocation property has been removed. Use ITable.Insets with corresponding Left and Top values instead.
  • Renamed all occurrences of Cleanup to CleanUp in API names.
  • ItemClickedEventArgs now extends ClickEventArgs.
  • CreateEdgeInputMode's EdgeCreator might receive null as targetPortCandidate parameter. Callbacks must handle this case by either creating a target port of their own or canceling the edge creation by returning null.
  • The StripeSubregion.TargetTableNode property is now read-only.
  • Renamed the enumeration value ShowFocusPolicy.WhenFocused to OnlyWhenFocused.
  • Removed unnecessary Enabled parts from the following property names.
    • EdgeSegmentLabelModel.AutoRotationEnabled is now AutoRotation.
    • EdgePathLabelModel.AutoRotationEnabled is now AutoRotation.
    • LabelLayoutTranslator.AutoFlippingEnabled is now AutoFlipping.
    • SingleCycleLayout.FromSketchModeEnabled is now FromSketchMode.
    • SliderEdgeLabelLayoutModel.AutoRotationEnabled is now AutoRotation.
    • DiscreteEdgeLabelLayoutModel.AutoRotationEnabled is now AutoRotation.
  • Renamed the methods ContextConfigurator.GetTransform to CreateTransform and GetClip to CreateClip.
  • Renamed the Animator.Destroy method to Stop.
  • The GraphEditorInputMode.CreateMoveUnselectedInputMode method has been removed. Use the property MoveUnselectedInputMode instead.
  • The CreateEdgeInputMode.ShowPortCandidates property has now the enum type ShowPortCandidates instead of boolean.
  • Removed the (undocumented) classes SelectionControl, HighlightControl, and FocusControl.
  • Removed SnapLine.SnapLineColorKey, which never worked correctly. Use SnapLine.SnapLinePenKey instead.

Changes of Default Behavior

  • The OverviewInputMode.AutoMouseWheelZoom property is superseded by the new MouseWheelBehavior property.
  • The CanvasControl.DragSize property no longer applies to touch input. Use the new property DragSizeTouch for controlling the drag size for touch input.
  • The CanvasControl.HitTestRadius property no longer applies to touch input. Use the new property HitTestRadiusTouch for controlling the hit test radius of touch input.
  • RectD.IsFinite and SizeD.IsFinite now also consider empty instances as not finite.
  • By default, stripe labels that are programmatically selected or highlighted don't show a selection or highlight indicator anymore.
  • Inertia scrolling of the viewport behaves now in a more natural way. The scrolling stops now after a fixed amount of time. Previously, the duration depended on the initial inertia velocity.
  • The IGraph.SetNodeLayout method and the various methods to create a node now throw an ArgumentException if the layout rectangle contains one or more NaN values. Similarly, the IGraph.SetBendLocation and the various methods to add a bend to an edge now throw an ArgumentException if the location point contains one or two NaN values.
  • GraphML: Duplicate properties on XAML input are now considered an error in accordance with the XAML specification.
  • The stroke thickness is now considered for the calculation of the origin of the default arrow visualizations. This can result in a slightly different rendering of the arrows.
  • The CreateEdgeInputMode.DummyEdge property is now always reset after the edge creation was finished or canceled.
  • MoveLabelInputMode: The moved label now is visualized as a preview instead of a symbolic rectangle. Set the Visualization property to Visualization.Ghost to restore the old mode.
  • The LayoutExecutor.UpdateContentRect property is now enabled by default.
  • CreateEdgeInputMode, determination whether the mouse hovers over a valid end: if ForceSnapToCandidate is disabled, the EndHitTestable now is queried first and a target port candidate is only searched if the hit testable returns true. Previously, the hit testable was only queried if no target port candidate was found at the current location.
  • Previously, even if the GraphModelManager.UseHierarchicEdgeNesting property was set to true, canvas objects for edges were added to the GraphModelManager.EdgeGroup as long as no group nodes were part of the graph. The corresponding new HierarchicNestingPolicy NodesAndEdges has no such behavior and thus, EdgeGroup is empty by default. Use one of the other polices if canvas objects for edges should be part of edgeGroup.
  • PolylineEdgeStyle defaults to an improved smoothing algorithm when using the SmoothingLength property. This is especially apparent when using large values for SmoothingLength.
  • The mouse button which is reported in Mouse2DEventArgs now is more synchronized with the real mouse button state. The old behavior can be restored using the new property HandleMissingMouseEvents on CanvasControl.

Minor Incompatible Changes

  • The method CollapsibleNodeStyleDecorator.CreateSelectionInstaller has been removed.

Types and Members Marked as Obsolete

  • The properties LayerConstraintFactory and SequenceConstraintFactory of HierarchicLayoutData have been marked as obsolete. The new properties LayerConstraints and SequenceConstraints should be used instead. Similarly, the extension methods HierarchicLayout.CreateLayerConstraintFactory(IGraph) and HierarchicLayout.CreateSequenceConstraintFactory(IGraph) have been marked as Obsolete.

Most Notable Demo Improvements

  • The new RotatableNode demo shows hows how support for rotated node visualizations can be implemented on top of the yFiles library.
  • The new RenderPolicies demo shows the effect of different render policies on the z-order of nodes, edges, labels and ports. This demo replaces the Integrated Node Style demo.
  • Demonstrated highlighting elements as hover effects in the Viewer demo.
  • GraphMLCompatibility demo: Added missing implementation of AnchoredParameter.
  • BpmnDemo: Fixed clone implementations of some styles.
  • yEd WPF: Fixed a bug that prevents using triangle arrows for edges.
  • yEd WPF: Fixed sharing of default element styles.