C# 在自定义UserControl中实现AutoSize

C# 在自定义UserControl中实现AutoSize,c#,winforms,user-controls,autosize,C#,Winforms,User Controls,Autosize,我有一个自定义用户控件,它使用GDI+绘制文本和图形。通常我使用DockStyle.Bottom在另一个控件中停靠它 此控件的大小由使用Graphics.MeasureString()的自定义布局确定。因此,每次宽度改变时,它都需要重新计算高度,而当父宽度改变时,高度也会改变 目前,我正在OnSizeChanged事件中设置此控件的高度。然而,我注意到一些错误与此。有时,当我调整父控件的大小时,该控件不接触父控件的底部,即使它被设置为DockStyle.bottom。我使用Spy++来分析控件边

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

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

目前,我正在OnSizeChanged事件中设置此控件的高度。然而,我注意到一些错误与此。有时,当我调整父控件的大小时,该控件不接触父控件的底部,即使它被设置为DockStyle.bottom。我使用Spy++来分析控件边界,在控件和父控件的边缘之间只有大约20像素的空白


我想在这个用户控件中实现一个适当的自动调整大小,假设采用顶部或底部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;
    }

祝你好运

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

祝你好运

尝试将FlowLayoutPanel和UserControl本身的AutoSize设置为true?为此使用FlowLayoutPanel是否有问题。或者锚定呢?如果在用户控件中的所有控件上使用锚定和停靠,并将它们设置为停靠控件的边缘,则控件将随UserControl调整大小,现在您也可以将锚定/停靠设置为UserControl。当您组合UserControl的Anchor和Dock属性以设置选项时,控件的边缘将显示在UI的其他部分。当UI调整大小时,您的控件也将正确调整大小。我的UserControl中没有控件。我有定制的内容。锚定在这种情况下不适用,因为大小不是由父对象确定的,只有宽度是由父对象确定的。高度需要由孩子根据宽度确定。我知道这有一个标准(它是Winforms中所有AutoSize控件的工作方式),我假设它是通过重写GetPreferredSize()实现的,但我还没有找到一个实际的示例实现。这个线程有帮助吗?尝试将FlowLayoutPanel和UserControl本身的AutoSize设置为true?为此使用FlowLayoutPanel是否有问题。或者锚定呢?如果在用户控件中的所有控件上使用锚定和停靠,并将它们设置为停靠控件的边缘,则控件将随UserControl调整大小,现在您也可以将锚定/停靠设置为UserControl。当您组合UserControl的Anchor和Dock属性以设置选项时,控件的边缘将显示在UI的其他部分。当UI调整大小时,您的控件也将正确调整大小。我的UserControl中没有控件。我有定制的内容。锚定在这种情况下不适用,因为大小不是由父对象确定的,只有宽度是由父对象确定的。高度需要由孩子根据宽度确定。我知道这有一个标准(它是Winforms中所有AutoSize控件的工作方式),我假设它是通过重写GetPreferredSize()实现的,但我还没有找到一个实际的示例实现。这个线程有帮助吗?