private void CalculateBounds() { if (Count == 0) { return; } this[0].NestedDockingStatus.SetDisplayingBounds(Container.DisplayingRectangle, Container.DisplayingRectangle, Rectangle.Empty); for (int i = 1; i < Count; i++) { DockPane pane = this[i]; NestedDockingStatus status = pane.NestedDockingStatus; DockPane prevPane = status.DisplayingPreviousPane; NestedDockingStatus statusPrev = prevPane.NestedDockingStatus; Rectangle rect = statusPrev.PaneBounds; bool bVerticalSplitter = (status.DisplayingAlignment == DockAlignment.Left || status.DisplayingAlignment == DockAlignment.Right); Rectangle rectThis = rect; Rectangle rectPrev = rect; Rectangle rectSplitter = rect; if (status.DisplayingAlignment == DockAlignment.Left) { rectThis.Width = (int)((double)rect.Width * status.DisplayingProportion) - (Measures.SplitterSize / 2); rectSplitter.X = rectThis.X + rectThis.Width; rectSplitter.Width = Measures.SplitterSize; rectPrev.X = rectSplitter.X + rectSplitter.Width; rectPrev.Width = rect.Width - rectThis.Width - rectSplitter.Width; } else if (status.DisplayingAlignment == DockAlignment.Right) { rectPrev.Width = (rect.Width - (int)((double)rect.Width * status.DisplayingProportion)) - (Measures.SplitterSize / 2); rectSplitter.X = rectPrev.X + rectPrev.Width; rectSplitter.Width = Measures.SplitterSize; rectThis.X = rectSplitter.X + rectSplitter.Width; rectThis.Width = rect.Width - rectPrev.Width - rectSplitter.Width; } else if (status.DisplayingAlignment == DockAlignment.Top) { rectThis.Height = (int)((double)rect.Height * status.DisplayingProportion) - (Measures.SplitterSize / 2); rectSplitter.Y = rectThis.Y + rectThis.Height; rectSplitter.Height = Measures.SplitterSize; rectPrev.Y = rectSplitter.Y + rectSplitter.Height; rectPrev.Height = rect.Height - rectThis.Height - rectSplitter.Height; } else if (status.DisplayingAlignment == DockAlignment.Bottom) { rectPrev.Height = (rect.Height - (int)((double)rect.Height * status.DisplayingProportion)) - (Measures.SplitterSize / 2); rectSplitter.Y = rectPrev.Y + rectPrev.Height; rectSplitter.Height = Measures.SplitterSize; rectThis.Y = rectSplitter.Y + rectSplitter.Height; rectThis.Height = rect.Height - rectPrev.Height - rectSplitter.Height; } else { rectThis = Rectangle.Empty; } rectSplitter.Intersect(rect); rectThis.Intersect(rect); rectPrev.Intersect(rect); status.SetDisplayingBounds(rect, rectThis, rectSplitter); statusPrev.SetDisplayingBounds(statusPrev.LogicalBounds, rectPrev, statusPrev.SplitterBounds); } }