在自定义UserControl中实现AutoSize
本文关键字:实现 AutoSize UserControl 自定义 | 更新日期: 2023-09-27 18:26:08
我有一个自定义的UserControl,它使用GDI+绘制文本和图形。通常我使用DockStyle.Bottom将其停靠在另一个控件中。
此控件的大小由使用Graphics.MeasureString()的自定义布局决定。因此,每次宽度更改时,它都需要重新计算高度,而父宽度更改时高度也会更改。
目前,我正在其OnSizeChanged事件中设置此控件的高度。然而,我注意到了一些错误。有时,当我调整父对象的大小时,控件不会接触到父对象的底部,即使它被设置为DockStyle.bottom。我使用Spy++分析控件边界,控件和父对象的边缘之间只有大约20个像素的空白。
我想在这个UserControl中实现一个适当的AutoSize,假设是Top或Bottom DockStyle。
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;
}
祝你好运!