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

时间:2010-11-12 16:05:59

标签: c# winforms datagridview mouseevent

这个真的踢我的背后。我有一个表单,由应用程序的主要形式生成并拥有,用于搜索记录。表单放在一个停靠的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时,行为不会改变(它不会同时停止)。

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

修改:以下是一些显示设计器和应用内部布局行为的请求图片:

alt text alt text alt text alt text

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

5 个答案:

答案 0 :(得分:6)

Epic Facepalm。

在此表单的构造函数(用户代码端)中,我调用SuspendLayout()来执行可能影响布局的一些其他设置。猜猜完成后我没有打电话。

如果您致电SuspendLayout进行自己的自定义布局更改,请务必在完成后致电ResumeLayout(true)(或ResumeLayout(false)后跟PerformLayout())。

答案 1 :(得分:4)

控件是否已锚定(.Anchor属性),还是已停靠?我发现设置一个会禁用另一个。我会查看.Designer.cs文件,看看是否正在设置dock和anchor属性,甚至可能从源代码中删除属性(当然事先备份)。

我通常尝试的另一件事是以单独的新形式重新创建表单,看看我是否得到相同的结果。

答案 2 :(得分:1)

我遇到的问题是usercontrols没有按照你所描述的方式执行操作,因为usercontrol autoscalemode属性设置为'font' - 尝试将其更改为继承。

答案 3 :(得分:1)

尝试在Dock = DockStyle.Fill的容器上设置TableLayoutPanel

答案 4 :(得分:0)

不要将各个控件停靠或锚定在TableLayoutPanel中。那很少能做到你想要的。