I am working on a Windows Forms project. It contains a tab controller with multiple pages and multiple controls on each.
It appears that relatively recently, after some form changes, that each time I build and run the solution the form resizes/shrinks.
So if I set the size of the form height to 768, once I click 'Start' to build and run it, I can actually catch a glimpse of it resizing itself during the process and then the form loads 21 pixels shorter than the height value it was at build for.
If I then keep building and running my project, the form will decrease by 21 pixels each time, making it smaller and smaller with every build.
We think it might have been introduced when we added the 'DataGridView' controller to one of the tabs, but we have yet to prove if that's the case.
Is there a reason why this would be happening, and what could be doing this? Why would it resize itself during build run time?
The Problem
Apparently there is a bug in Visual Studio 2015. It is not calculating the
Size
properly when certain circumstances are met. In my case I was using the following...Now... If you close this form and open it back up the
Size
is still exactly the same (600, 170). If you change the following property...Then you closes the form and open it back up you will notice the
Size
has now been changed to (610, 203).My guess is that the bug is not accounting for two things. One would be the form title bar HEIGHT. The other would be the title bar icon WIDTH. This would be the offset of a
WIDTH of 10
pixels and aHEIGHT of 33
pixels.The Solution
Well you actually have three workarounds. One would be to offset the
MinimumSize
. Another would be to actually show theControlBox
. The last one would be to fix the issue in code by setting theControlBox
property after the form is initialized.Offsetting The
MinimumSize
:So the first option would be to offset what you want the
MinimumSize
to be by (w:10, h:33). So for example, If you want theMinimumSize
to be (600, 170) then you need to set it to (590, 137). That would actually produce the size you expect to see.Showing the
ControlBox
:Simply change the following property...
Correcting the issue with code:
You will need to change the following property at design-time...
Then you will need to set the
ControlBox
property toFalse
after the form is initialized.This is an annoying bug, and I have suffered similar behavior myself. However, there maybe a couple of workarounds, however be warned though, these may or may not help and sound a little hacky.
Solution 1
If your control isn't docked, docking may help.
Solution 2
You might be able to change your DPI settings to eliminate the problem, i.e.:
Display Properties → Settings tab → Advanced. In the the Advanced dialog I changed the "DPI Settings" from Large (120 dpi) to Normal (96 dpi).
Solution 3
This is maybe due to AutoScaleMode-property. Your forms may have been designed with a different DPI or font settings than you have now in Windows display settings. Try setting the AutoScaleMode-property to None in your form and offending controls, and they won't be automatically re-sized anymore.
I had the same problem. My solution:
My PC's system is Windows 10. The resolution of the monitor was 125%, and I set it to 100%. Then I set the size of the form, not changed.
You can see the resolution settings in this picture:
In Turkish "Scale" is "Ölçekle". There are resolution options on the bottom ("ölçekle ve düzenle").
OK, so first in response to Saruman's suggested solutions..
None of the controllers in the application where had docked values. A good few were anchored, but none appeared docked. I docked a couple of the main containers I could find, and it didn't seem to make much difference. Admittedly I didn't dock every single controller, but I then moved onto solution 2...
I wasn't sure where to find the DPI settings. Whether somewhere in Visual Studio, or on my machine. So I moved onto proposed solution 3...
On the Form initialize, I added 'this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;'. This then seemed to automatically place it above a 'this.ClientSize = new System.Drawing.Size(11264,730)' method, which piqued my interest.
With a little further debugging, it appears that when the application builds and intializes, the 'this.ClientSize' property is already set at a very low, more or less, '230x200'. I am not sure where this value comes from, but I wonder if it has anything to do with the initial resizing before it then tries to set it again to something bigger...
Regardless, I came across another suggestion to possibly double check my form's minimum width and height properties, and noticed they were set to 0x0, I'm assuming by default.
So I set the minimum values to be the same as my form's size value, and on subsequent builds it appears to be keeping its size now! Or at least, it isn't shrinking any more from what I can tell.
I'm not sure if setting the minimum form size is an acceptable solution for this bizarre behaviour, but so far it seems to be keeping the application size consistent on each build we do, which is a relief at the moment.
If any one has further knowledge on the ClientSize property and if I am right to be concerned about its initial low size, would be great to hear it. :)
I figured it out!
If you click on the form in "Design View" → "Properties" → "MinimizeBox" and change "True" to "False".