在FlowLayoutPanel的布局事件处理程序中设置子控件宽度

时间:2011-12-07 14:48:34

标签: c# .net winforms flowlayoutpanel

我有一个flowLayoutPanel,它是用子控件动态填充的。 此flowLayoutPanel可能位于不同表单的某些面板上,因此其大小可能会在运行时更改。

添加第一个子控件时,我将其宽度设置为flowLayoutPanel.Width - 10。 对于其他控件,我设置了DockStyle = Fill。

还有flowLayoutPanel_Layout事件处理程序hich更改第一个控件宽度:flowLayoutPanel.Controls [0] .Width = flowLayoutPanel.Width - 10;

对于大多数情况它工作正常,但在其中一个表单上,我遇到了一个问题:当加载表单时,flowLayoutPanel将所有控件宽度设置为一个值(127)。当我最大化表单时,使用正确的flowLayoutPanel.Width调用flowLayoutPanel_Layout(例如,类似于400像素),但在将其设置为flowLayoutPanel.Width - 10后,flowLayoutPanel.Controls [0] .Width不会更改。它仍然等于127.没有例外或任何事情。

什么会导致这种行为?

1 个答案:

答案 0 :(得分:1)

找到问题的根源:当有许多嵌套控件时,此问题出现在64位Windows Vista和7上: http://blogs.msdn.com/b/alejacma/archive/2008/11/20/controls-won-t-get-resized-once-the-nesting-hierarchy-of-windows-exceeds-a-certain-depth-x64.aspx

在我的控制中覆盖OnSizeChanged帮助:

protected override void OnSizeChanged(EventArgs e)
{
  if (!DesignMode && IsHandleCreated)
    BeginInvoke((MethodInvoker)delegate{base.OnSizeChanged(e);});
  else
    base.OnSizeChanged(e);
}