@@ -18,8 +18,8 @@ static FluxoDesigner()
1818 private bool ? _isLoaded ;
1919 private DispatcherTimer ? _autoPanningTimer ;
2020
21- private readonly TranslateTransform _translateTransform = new ( ) ;
22- private readonly ScaleTransform _scaleTransform = new ( ) ;
21+ private readonly TranslateTransform TranslateTransform = new ( ) ;
22+ private readonly ScaleTransform ScaleTransform = new ( ) ;
2323
2424 public FluxoDesigner ( )
2525 {
@@ -28,8 +28,8 @@ public FluxoDesigner()
2828 this . AddHandler ( FluxoNode . DragCompletedEvent , new DragCompletedEventHandler ( this . OnNodeDragCompleted ) ) ;
2929
3030 var transform = new TransformGroup ( ) ;
31- transform . Children . Add ( _scaleTransform ) ;
32- transform . Children . Add ( _translateTransform ) ;
31+ transform . Children . Add ( ScaleTransform ) ;
32+ transform . Children . Add ( TranslateTransform ) ;
3333
3434 this . SetValue ( ViewportTransformPropertyKey , transform ) ;
3535
@@ -577,8 +577,12 @@ public void AutoLayout()
577577
578578 var nodes = this . ItemsHost . Children . OfType < FluxoNode > ( ) ;
579579
580+ var dfsScope = nodes . ToDictionary ( k => k , v => 0 ) ;
581+
580582 var pos = new Point ( this . ViewportLocation . X + 160d , this . ViewportLocation . Y + 100d ) ;
581583
584+ var hashTree = new Dictionary < int , List < FluxoLayoutTree > > ( ) ;
585+
582586 Sorting ( ) ;
583587
584588 void Sorting ( )
@@ -591,6 +595,8 @@ void Sorting()
591595 {
592596 var tree = BuildTree ( root , 0 ) ;
593597
598+ BuildHash ( tree , 0 ) ;
599+
594600 Hierarchy ( tree , pos ) ;
595601 }
596602
@@ -625,6 +631,20 @@ void Translate(FluxoLayoutTree node, Point location)
625631 new Point ( node . Node . Location . X + node . Node . ActualWidth + span , child . Node . Location . Y + dy ) ) ;
626632 }
627633 }
634+
635+ void BuildHash ( FluxoLayoutTree root , int depth )
636+ {
637+ if ( hashTree . TryGetValue ( depth , out var value ) )
638+ {
639+ value . Add ( root ) ;
640+ }
641+ else
642+ {
643+ hashTree [ depth ] = [ root ] ;
644+ }
645+
646+ root . Nexts . ForEach ( node => BuildHash ( node , depth + 1 ) ) ;
647+ }
628648 }
629649
630650 FluxoLayoutTree BuildTree ( FluxoNode root , int depth )
@@ -634,16 +654,20 @@ FluxoLayoutTree BuildTree(FluxoNode root, int depth)
634654 Depth = depth
635655 } ;
636656
657+ dfsScope [ root ] = 1 ;
658+
637659 var nexts = root . Lines . Where ( x => root . NodeId . Equals ( x . SourceId ) ) . Select ( x => x . Target ) ;
638660
639661 foreach ( var next in nexts )
640662 {
641- if ( next != null )
663+ if ( next != null && dfsScope [ next ] == 0 )
642664 {
643665 tree . AddNext ( BuildTree ( next , depth + 1 ) ) ;
644666 }
645667 }
646668
669+ dfsScope [ root ] = - 1 ;
670+
647671 return tree ;
648672 }
649673 }
@@ -660,9 +684,9 @@ private static void OnViewportLocationChanged(DependencyObject d, DependencyProp
660684 {
661685 if ( d is FluxoDesigner designer && e . NewValue is Point translate )
662686 {
663- designer . _translateTransform . X = - translate . X * designer . Zoom ;
687+ designer . TranslateTransform . X = - translate . X * designer . Zoom ;
664688
665- designer . _translateTransform . Y = - translate . Y * designer . Zoom ;
689+ designer . TranslateTransform . Y = - translate . Y * designer . Zoom ;
666690
667691 designer . RaiseEvent ( nameof ( designer . ViewportUpdated ) , new RoutedEventArgs ( ) ) ;
668692 }
0 commit comments