public override void Arrange(Rectangle target) { Bounds = RemoveMargin(target); var headerSize = GetHeaderSize(); var childContentSize = Child == null ? Rectangle.Empty : Child.GetMinSize(); var topContentPadding = Math.Max(headerSize.Height/2, _contentBorder.FixedBorder.Top); var contentBorderBounds = new Rectangle(Bounds.X, Bounds.Y + headerSize.Height/2, childContentSize.Width + _contentBorder.FixedBorder.Horizontal, childContentSize.Height + _contentBorder.FixedBorder.Bottom + topContentPadding); var headerBorderBounds = string.IsNullOrEmpty(Title) ? contentBorderBounds : new Rectangle(contentBorderBounds.X + contentBorderBounds.Width / 2 - headerSize.Width / 2, Bounds.Y, headerSize.Width, headerSize.Height); var contentBounds = childContentSize; contentBounds.X = contentBorderBounds.X + _contentBorder.FixedBorder.Left; contentBounds.Y = contentBorderBounds.Y + topContentPadding; var merged = Rectangle.Union(contentBorderBounds, headerBorderBounds); var arranged = ArrangeToAlignments(Bounds, merged); var differenceX = arranged.X - merged.X; var differenceY = arranged.Y - merged.Y; contentBorderBounds = contentBorderBounds.Translate(differenceX, differenceY); contentBounds = contentBounds.Translate(differenceX, differenceY); headerBorderBounds = headerBorderBounds.Translate(differenceX, differenceY); _contentBorder.SetBounds(contentBorderBounds); if (Child != null) Child.Arrange(contentBounds); if (!string.IsNullOrEmpty(Title)) _headerBorder.SetBounds(headerBorderBounds); }