2012-02-27 67 views
1

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

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

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

我想在此用户控件中实现一个适当的AutoSize,并假设顶部或底部DockStyle。

+0

尝试为FlowLayoutPanel和UserControl本身设置AutoSize为true? – 2012-02-27 22:14:53

+0

不使用FlowLayoutPanel。 – 2012-02-27 22:19:36

+0

为此使用FlowLayoutPanel有什么问题吗?或者如何设置Anchor?如果您在用户控件的所有控件上使用锚点和停靠点,并将它们设置为停靠在控件边缘,则控件将使用UserControl调整大小,并且现在可以将锚点/停靠点也设置为UserControl。当您结合UserControl的Anchor和Dock属性设置选项时,控件的边缘会显示到UI的其他部分。当UI被调整大小时,您的控件也将被正确调整大小。 – 2012-02-27 22:29:09

回答

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

祝您好运!