在自定义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。

在自定义UserControl中实现AutoSize

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;
    }

祝你好运!