Search code examples
c#winformsuser-controlsautosize

Implementing AutoSize in a custom UserControl


I have a custom UserControl which draws text and graphics using GDI+. Normally I dock it using DockStyle.Bottom within another control.

The size of this control is determined by a custom layout using Graphics.MeasureString(). Therefore, it needs to recalculate the height everytime the width changes, which is changed when the parent width changes.

Currently I am setting this control's height in its OnSizeChanged event. However I am noticing some bugs with this. Sometimes when I resize the parent, the control is not touching the bottom of the parent, even though it is set to DockStyle.Bottom. I used Spy++ to analyze the control bounds and there is simply some empty space between the control and the edge of the parent by about 20 pixels.

I want to implement a proper AutoSize in this UserControl assuming a Top or Bottom DockStyle.


Solution

  • The DefaultLayout engine for WindowsForms has quite a bit logic in there for laying out docked controls. I would recommend a decompiler (dotPeek, Reflector, etc.) and decompile the DefaultLayout class.

    There is a lot interaction between the control itself, its children, whether it overrides GetPreferredSize etc. etc.

    Perhaps when you understand the context under which your GetPreferredSize is called, you'll get a better idea of how to implement it.

    In terms of sample implementations, again, what better than the Windows controls themselves? Decompile a few. Here'as an example from ToolStripItem

     public virtual Size GetPreferredSize(Size constrainingSize)
        {
          constrainingSize = LayoutUtils.ConvertZeroToUnbounded(constrainingSize);
          return this.InternalLayout.GetPreferredSize(constrainingSize - this.Padding.Size) + this.Padding.Size;
        }
    

    Good luck!