Version 3.1 is the current major release of yFiles WPF.
The latest release of yFiles WPF is version 3.1.0.1. (See also the entire yFiles WPF change log.)
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. 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.
LabelDropInputMode
and PortDropInputMode
classes implement drag and drop for labels and ports, respectively. The API of these classes is similar to NodeDropInputMode
for nodes. 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. 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.
HierarchicLayoutData.SubComponents
property can be used to configure the new sub-components feature of the hierarchic layout. 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. 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. LassoSelectionInputMode
. GraphInputMode.LassoSelectionInputMode
property and a corresponding factory method. LassoSelectionInputMode
is disabled per default. GraphInputMode.LassoSelect
method programmatically selects all items in the provided GeneralPath
. ILassoTestable
interface specifies whether the item is considered to be inside the lasso path. This is analog to the IMarqueeTestable
interface for marquee selection. 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
. IsInPath
method of Node
/Edge
/Port
/LabelStyleBase
can be overridden to customize the lasso testing behavior. 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. PositionHandlers.Combine
combines multiple position handler instances into a single instance. ElementsCopied
, ElementsCut
, and ElementsPasted
to GraphEditorInputMode
, and the event ElementsCopied
to GraphViewerInputMode
. Animations.CreateSequentialAnimation
method creates an animation that animates multiple animations in sequence. MarqueeSelectionInputModes.CalculateMarqueeRectangle
. ITable.GetDecorator
with the RowDecorator
, ColumnDecorator
and StripeLabelDecorator
properties. 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. TreeMapLayoutData
configuration class for the new TreeMapLayout
algorithm. TabularLayoutData
configuration class for the new TabularLayout
algorithm. TemporaryGroupNodeInsertionData
configuration class for the new TemporaryGroupNodeInsertionStage
layout stage. HierarchicLayoutData.SubComponents
property can be used to configure the new sub-components feature of the hierarchic layout. 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. OrthogonalLayout.MaximumDuration
controls the preferred time limit of this layout algorithm. 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
. 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
. 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.
PlaceNodesAtBarycenterStage
places a user-specified subset of nodes on the barycenter of their neighbors. During the core layout, these node are hidden. PointD.ToMutablePoint
and RectD.ToMutableRectangle
methods now return a MutablePoint
instead of IMutablePoint
and a MutableRectangle
instead of a IMutableRectangle
, respectively. GeneralPath.Intersects(GeneralPath)
determines whether the path intersects with another GeneralPath
. IgnoreXamlDeserializationErrors
enabled, invalid property content is now skipped instead of discarding the whole object with such content. 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. ElementCopiedCallback
parameter of the methods GraphCopier.Copy
and GraphClipboard.Duplicate
is now optional (and can be null). 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
. 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.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. GraphModelManager.GetMainCanvasObject
returns the canvas object that should be used when changing the visibility or z-order of a model item. ComponentCommands.ScrollPage
commands now accept any IConvertible
command parameter instead of only doubles and strings. CanvasControl.ZoomTo
methods, there are now two CanvasControl.ZoomToAnimated
methods that animate the viewport change. GraphOverViewControl
now keeps configuration changes made to the overview's VisualCreator
instance. GraphOverviewControl
.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. CanvasControl.CreateInputModeContext
method is now public instead of protected. GraphEditorInputMode
and TableEditorInputMode
: Method EditLabel
now also returns a Future, similar to AddLabel
and CreateLabel
. INode
parameter of the NavigationInputMode.EnterGroup
method is now optional. If it is omitted or null
the whole graph will be revealed. MoveViewportInputMode.SnapPanning
and SnapPanningThreshold
allow for snapping touch panning to one axis. MoveInputMode
for unselected nodes now moves the bends of adjacent self-loops, too. FindNextItem
and FindNearestItem
of NavigationInputMode
can be used to configure the determination of the "next" item. T
of class ItemDropInputMode
<T> is no longer restricted to IModelItem
. 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. CreateEdgeInputMode.GetSourcePortCandidates
protected method makes source port candidate determination more flexible. initialTargetLocation
of the CreateEdgeInputMode.DoStartEdgeCreation
method can be used to define the initial location that shall be used to find a target node. 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. CreateEdgeInputMode.StartOverCandidateOnly
property can be used to restrict the start of an edge creation gesture to directly hovered port candidates. TextEditorInputMode.TextBoxPlacementPolicy
property provides finer control of what happens when the TextBox
is (partially) outside of the viewport. TextEditorInputMode.TextBoxPadding
property controls the padding between the TextBox
and the border of the canvas. 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. MaximumSnapDistance
, ShowHitPortOwnerCandidatesOnly
and Visualization
have been added to PortRelocationHandleProvider
and are applied to each PortRelocationHandle
created by this provider. PortRelocationHandle
to allow customization of the port candidates. 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. 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. ItemTapped
, ItemDoubleTapped
, and CanvasTapped
have been added to GraphInputMode
. TapEventArgs.TapCount
property can be used to distinguish between single and multiple taps. 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. 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. NodeControlNodeStyle.GetPreferredSize
, LabelControlLabelStyle.GetPreferredSize
and PortControlPortStyle.GetPreferredSize
when implicit styling is used. ITable
is now optional: FindRow
, FindColumn
, FindStripe
, and FindStripes
. TableEditorInputMode
now handles clicks and taps similar to GraphEditorInputMode
: ItemClicked
, ItemLeftClicked
, ItemRightClicked
, ItemDoubleClicked
, ItemLeftDoubleClicked
, ItemRightDoubleClicked
, ItemTapped
, ItemDoubleTapped
events are raised. ClickableItems
and ClickableRegions
determine for which items and regions a click or tap event will be raised. ICanvasContext.ToWorldCoordinates
.VisualGroup
in very large visual trees.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
. LayoutExecutor.CreateLayoutGraphAdapter
callback method makes it possible to configure the LayoutGraphAdapter
that is used for the layout calculation. TreeLayoutData.CriticalEdgePriorities
property can be used to specify critical edges. SmartEdgeLabelModel
now is properly handled by labeling algorithms, resulting in better label placements. ImprovePortAssignment
property of LayoutExecutor
and LayoutGraphAdapter
enables PortCalculator
to improve the port assignment. PartitionGridData
and TableLayoutConfigurator
has been improved: PartitionGridData
now reuses the PartitionGrid
created by the TableLayoutConfigurator
. TableLayoutConfigurator
which provide access to the PartitionCellId
assignment of the configurator as well as the mappings between IRow
/IColumn
and RowDescriptor
/ColumnDescriptor
. 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 DataProvider
s registered with PortConstraintKeys.SourcePortGroupIdDpKey
and PortConstraintKeys.TargetPortGroupIdDpKey
. TreeComponentLayout
: Added property ConsiderUndirectedTrees
that 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
. 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. 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. HierarchicLayout
class now respects the sequence and layering constraints between subcomponents. Previously, such constraints were ignored. PlaceNodesAtBarycenterStageData
which allows to conveniently define the affected nodes that should be affected by PlaceNodesAtBarycenterStage
.HierarchicLayout
now requires less memory for graphs with sequence constraints.HierarchicLayout
no longer inserts superfluous bends for edges between group nodes if the input graph contains grouped edges.DefaultEdgePathCropper
.Mouse2DEventTypes.Entered
event now provides the correct coordinates.PolylineEdgeStyle
now takes arrow heads into account for visibility checks.CanvasControl.LongPressTime
property was used instead of the CanvasControl.DragTime
property. HighlightIndicatorManager
, FocusIndicatorManager
, or SelectionIndicatorManager
no longer results in a NullReferenceException
. OrientedRectangleExtensions.GetCenter
didn't return the correct center if the width or height of the rectangle was equal to 0. HitTestRadius
property of the following implementations of ICanvasContext
now correctly contain the value in world coordinates instead of view coordinates: Contexts.CreateCanvasContext
when passing a CanvasControl
but no hit test radius. DisposeVisualCallback
.IPositionHandlers
by MoveInputMode
.InteriorStretchLabelModel.GetMinimumNodeSize
method now uses the correct insets for width calculation. Previously the top insets were erroneously used for the width. GroupNodeDefaults.Labels.AutoAdjustPreferredSize
property and the GroupNodeDefaults.Ports.AutoCleanup
property were not considered for labels and ports of groups. ApplicationCommands.Copy
command is no longer executed twice.GraphClipboard.Copy
and GraphClipboard.Cut
don't copy items anymore which depend on items that are selected but not included in GraphClipboard.CopyItems
. FreeEdgeLabelModel
: Static property Instance
is now excluded from obfuscation. 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. 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
. IPortSnapResultProvider
never returned any snap results. DefaultGraph
now calls the OnRemovingEdge
and OnRemovingPort
methods before their incident items are removed. Copy
, Cut
, and Duplicate
are no longer enabled if there are no elements to cut, copy, or duplicate. 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. FxCop
. GraphModelManager
: Fixed NullReferenceException
that occured when any of the Descriptor properties were set while the GraphModelManager
instance was not yet associated to an IGraph
. 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. IArrow
instances that were created with the Arrow.GetAsFrozen
method. 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. 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. MarqueeSelectionInputMode
during the gesture via code left the marquee visible on the screen. 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.GraphSnapContext.NodeToEdgeDistance
property is set to -1.0
. 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. 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. KeyEventRecognizers
ShiftPressed
, AltPressed
and CtrlPressed
now also recognize the modifier if the event has Touch2DEventArgs
. 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. 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
.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
. ITable.LabelRemoved
events for the implicitly removed associated labels are now raised, too. TextBox
now is correctly placed. OrthogonalLayout
now considers edge grouping also if there are no directed edges specified. EdgeRouter
, an error occurred when there were intermediate routing points and the path search got aborted (e.g. because of maximum duration time limit). ShortestPaths
, an error occurred when the a-star algorithm was applied to a graph with non-monotonic heuristic costs. 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. 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. OrthogonalLayout
that may have caused infinite looping for grouped input graphs. 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. TreeMapLayout
that may have caused NaN
-coordinates or infinite looping for input graphs that are non-directed trees. GraphLayoutLineWrapper
now produces more compact results. GraphLayoutLineWrapper
produced drawings with large empty space between lines. HierarchicLayout
: Fixed problem that sometimes caused an unnecessarily large distance between adjacent layers. 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.EdgeRouter
now always considers the PortCandidates
for edges grouped with fixed edges.EdgeRouter
now keeps collinear bends of fixed edges.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. ReparentStripePositionHandler
: All callback methods dealing with ghost objects have been renamed consistently: UpdateXyzVisualisation
to UpdateXyzGhost
.UpdateTargetVisualizationBounds
to UpdateTargetGhostBounds
.MoveLabelInputMode.CreateLabelHitTestable
has been removed. Developers who want to set a custom instance need to set it directly to the HitTestable
property. CanvasComponent.AnimateScrollTo
method has been removed and is superseded by the new ZoomToAnimated
methods. AnchoredPortLocationModelExtension
class has been moved to the GraphML compatibility demo where it was really needed. GraphInputMode.CanvasClicked
event now provides the GraphEditorInputMode
or the GraphViewerInputMode
as parent input mode in the Context
property of its ClickEventArgs
. ITable.RelativeLocation
property has been removed. Use ITable.Insets
with corresponding Left
and Top
values instead. 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. StripeSubregion.TargetTableNode
property is now read-only.ShowFocusPolicy.WhenFocused
to OnlyWhenFocused
. 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
.ContextConfigurator.GetTransform
to CreateTransform
and GetClip
to CreateClip
. Animator.Destroy
method to Stop
.GraphEditorInputMode.CreateMoveUnselectedInputMode
method has been removed. Use the property MoveUnselectedInputMode
instead. CreateEdgeInputMode.ShowPortCandidates
property has now the enum type ShowPortCandidates
instead of boolean
. SelectionControl
, HighlightControl
, and FocusControl
. SnapLine.SnapLineColorKey
, which never worked correctly. Use SnapLine.SnapLinePenKey
instead. OverviewInputMode.AutoMouseWheelZoom
property is superseded by the new MouseWheelBehavior
property. CanvasControl.DragSize
property no longer applies to touch input. Use the new property DragSizeTouch
for controlling the drag size for touch input. 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. 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. 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. 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. 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
. Mouse2DEventArgs
now is more synchronized with the real mouse button state. The old behavior can be restored using the new property HandleMissingMouseEvents
on CanvasControl
.CollapsibleNodeStyleDecorator.CreateSelectionInstaller
has been removed. 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. RotatableNode
demo shows hows how support for rotated node visualizations can be implemented on top of the yFiles library. 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. 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.