Index: Control.cs =================================================================== --- Control.cs (revision 68351) +++ Control.cs (working copy) @@ -3762,6 +3762,15 @@ // SetBoundsCore updates the Win32 control itself. UpdateBounds updates the controls variables and fires events, I'm guessing - pdb if (IsHandleCreated) { XplatUI.SetWindowPos(Handle, x, y, width, height); + + // Win32 automatically changes negative width/height to 0. + // The control has already been sent a WM_WINDOWPOSCHANGED message and it has the correct + // data, but it'll be overwritten when we call UpdateBounds unless we get the updated + // size. + if (width < 0 || height < 0) { + int cw, ch, ix, iy; + XplatUI.GetWindowPos(Handle, this is Form, out ix, out iy, out width, out height, out cw, out ch); + } } UpdateBounds(x, y, width, height); Index: XplatUIX11.cs =================================================================== --- XplatUIX11.cs (revision 68351) +++ XplatUIX11.cs (working copy) @@ -4725,6 +4725,12 @@ return; } + // Win32 automatically changes negative width/height to 0. + if (width < 0) + width = 0; + if (height < 0) + height = 0; + // X requires a sanity check for width & height; otherwise it dies if (hwnd.zero_sized && width > 0 && height > 0) { if (hwnd.visible) {