public void DockPlacementTo(Placement placement, Placement target, DockSite site, float stretch) { if (site == DockSite.Fill) { target.SwitchType( targetPanelPlacement => { if (placement is TabBarPlacement tabBarPlacement) { DockPlacementTo(tabBarPlacement, targetPanelPlacement); } if (placement is PanelPlacement panelPlacement) { DockPlacementTo(panelPlacement, targetPanelPlacement); } }, targetTabBarPlacement => { if (placement is TabBarPlacement tabBarPlacement) { DockPlacementTo(tabBarPlacement, targetTabBarPlacement); } if (placement is PanelPlacement panelPlacement) { targetTabBarPlacement.Placements.Add(panelPlacement); } }, targetSplitPlacement => targetSplitPlacement.Append(placement) ); return; } if (target.Parent is TabBarPlacement) { target = target.Parent; } var parent = (SplitPlacement)target.Parent; var splitPlacement = new SplitPlacement(); var isFirst = site == DockSite.Left || site == DockSite.Top; var wasFirst = parent.FirstChild == target; target.Unlink(); if (isFirst) { splitPlacement.Initialize(placement, target, site.GetSeparator(), stretch); } else { splitPlacement.Initialize(target, placement, site.GetSeparator(), 1 - stretch); } if (wasFirst) { parent.FirstChild = splitPlacement; } else { parent.SecondChild = splitPlacement; } }