protected override void OnSizeAllocated (Rectangle allocation) { base.OnSizeAllocated (allocation); int vwidth = vScrollBar.Visible ? vScrollBar.Requisition.Width : 0; int hheight = hScrollBar.Visible ? hScrollBar.Requisition.Height : 0; var childRectangle = new Rectangle (allocation.X + 1, allocation.Y + 1, allocation.Width - vwidth - 2, allocation.Height - hheight - 2); if (Child != null) Child.SizeAllocate (childRectangle); if (vScrollBar.Visible) { int vChildTopHeight = -1; foreach (var child in children.Where (child => child.ChildPosition == ChildPosition.Top)) { child.Child.SizeAllocate (new Rectangle (childRectangle.RightInside (), childRectangle.Y + vChildTopHeight, allocation.Width - vwidth, child.Child.Requisition.Height)); vChildTopHeight += child.Child.Requisition.Height; } int v = vScrollBar is Scrollbar && hScrollBar.Visible ? hScrollBar.Requisition.Height : 0; vScrollBar.SizeAllocate (new Rectangle (childRectangle.X + childRectangle.Width + 1, childRectangle.Y + vChildTopHeight, vwidth, Allocation.Height - v - vChildTopHeight - 1)); vAdjustment.Value = System.Math.Max (System.Math.Min (vAdjustment.Upper - vAdjustment.PageSize, vAdjustment.Value), vAdjustment.Lower); } if (hScrollBar.Visible) { int v = vScrollBar.Visible ? vScrollBar.Requisition.Width : 0; hScrollBar.SizeAllocate (new Rectangle (allocation.X, childRectangle.Y + childRectangle.Height + 1, allocation.Width - v, hheight)); hScrollBar.Value = System.Math.Max (System.Math.Min (hAdjustment.Upper - hAdjustment.PageSize, hScrollBar.Value), hAdjustment.Lower); } }