在自定义UserControl中实现AutoSize

时间:2012-02-27 22:10:26

标签: c# winforms user-controls autosize

我有一个自定义UserControl,它使用GDI +绘制文本和图形。通常我将DockStyle.Bottom停靠在另一个控件中。

此控件的大小由使用Graphics.MeasureString()的自定义布局确定。因此,每次宽度变化时都需要重新计算高度,当父宽度发生变化时,高度会发生变化。

目前我在OnSizeChanged事件中设置此控件的高度。但是我注意到了一些错误。有时当我调整父级的大小时,控件不会触及父级的底部,即使它设置为DockStyle.Bottom。我使用Spy ++来分析控件边界,控件和父级边缘之间只有一些空的空间大约20个像素。

我想在此UserControl中实现一个正确的AutoSize,假设顶部或底部DockStyle。

1 个答案:

答案 0 :(得分:1)

WindowsForms的DefaultLayout引擎在布局停靠控件时有相当多的逻辑。我会推荐一个反编译器(dotPeek,Reflector等)并反编译DefaultLayout类。

控件本身,它的子节点之间有很多交互,它是否覆盖了GetPreferredSize等等。

也许当您了解调用GetPreferredSize的上下文时,您将更好地了解如何实现它。

在示例实现方面,还有什么比Windows控制自己更好?反编译一些。这里以ToolStripItem

为例
 public virtual Size GetPreferredSize(Size constrainingSize)
    {
      constrainingSize = LayoutUtils.ConvertZeroToUnbounded(constrainingSize);
      return this.InternalLayout.GetPreferredSize(constrainingSize - this.Padding.Size) + this.Padding.Size;
    }
祝你好运!