C# · 12月 23, 2021

c# – 调整窗口大小时锚定控件不会调整大小(56k注意)

这个真的踢我的背后.我有一个表单,由应用程序的主要形式生成并拥有,用于搜索记录.表单放在一个停靠的TableLayoutPanel中,结合了Absolute和Percentage大小的行/列,这样我的标签在数据输入和结果控件增长时保持相同的大小.我们谈论的是20个控件.

问题是,虽然TableLayoutPanel是填充对接的,并且所有子控件也都是填充对接的,但当我抓住窗口边缘并拖动时,表单内部没有任何大小调整大小.一切都在设计师中调整得很好,但在实际应用中却没有.

我确实使用了我的Google-fu,并找到了this SO question,它指向了this MSKB article.我创建了一个派生的FlowLayoutPanel和一个带有线程调用的派生TableLayoutPanel并将它们放入,但它仍然无法正常工作.这是发生这种情况的唯一形式,另一种形式也有一些非常深的嵌套(它使用TabControl和TableLayoutPanel来布局数据输入控件,但没有RB).

其他相关信息:

>没有设置MaxSize属性.
>除了默认的左上角之外,这种形式没有任何内容;几乎所有东西都填充到它的容器中.但是,包含搜索结果表的子用户控件使用锚定在内部布局;这在我使用这些控件的其他形式中并不是问题,我将它们填充到SplitPanels(嵌套两个深,不少).
> RadioButtons和Labels设置为AutoSize,但没有别的.这似乎是这些控件的默认行为,即使这些值在Designer中以粗体显示,并且与正确调整大小的其他窗口的设置相匹配.
>为表单触发调整大小事件,但不激活TLP.
>当TLP锚定到正在停靠的窗口INSTEAD时,行为不会改变(它不会同时出现).

我在这里撕扯我的头发.救命!

编辑:以下是一些显示设计器和应用程序中的布局行为的请求图片:

以“嵌套”开头的控件直接从内置面板控件派生,它们唯一的更改是重写OnSizeChanged()以异步调用基本方法(KB文章中的解决方法).如前所述,它也不适用于内置面板.从最后两个窗口可以看出,mainLayout TLP即使停靠在设计器的窗口中也不会增长.

解决方法 史诗Facepalm.

在这种形式的构造函数(用户代码端)中,我调用SuspendLayout()来执行一些可能影响布局的附加设置.猜猜完成后我没有打电话.

如果您调用SuspendLayout进行自己的自定义布局更改,请务必在完成后调用ResumeLayout(true)(或ResumeLayout(false),然后调用PerformLayout()).