我有一个自定义UserControl,它使用GDI +绘制文本和图形。通常我将DockStyle.Bottom停靠在另一个控件中。
此控件的大小由使用Graphics.MeasureString()的自定义布局确定。因此,每次宽度变化时都需要重新计算高度,当父宽度发生变化时,高度会发生变化。
目前我在OnSizeChanged事件中设置此控件的高度。但是我注意到了一些错误。有时当我调整父级的大小时,控件不会触及父级的底部,即使它设置为DockStyle.Bottom。我使用Spy ++来分析控件边界,控件和父级边缘之间只有一些空的空间大约20个像素。
我想在此UserControl中实现一个正确的AutoSize,假设顶部或底部DockStyle。
答案 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;
}
祝你好运!