【问题标题】:FlowLayoutPanel shows horizontal scroll bar with inner panel's width being the same as client size widthFlowLayoutPanel 显示水平滚动条,内面板宽度与客户端大小宽度相同
【发布时间】:2015-05-20 06:37:16
【问题描述】:

在 FlowLayoutPanel 的 ClientSizeChanged 事件上调整其子项的大小时,我遇到了 FlowLayoutPanel 的问题。

当 FlowLayoutPanel 调整大小时,我试图让孩子水平调整大小。问题是即使child的margin为0,FlowLayoutPanel的padding也为0,但是在ClientSizeChanged事件处理程序执行后,FlowLayoutPanel显示了它的水平滚动条,而child的宽度是与 FlowLayoutPanel.ClientSize.Width 完全相同

我尝试将代码移动到 Resize 事件,但仍然得到相同的结果。

这是一个演示问题的示例,有一个 FlowLayoutPanel 的以下属性已从默认值更改:

  • 自动滚动 = 真
  • FlowDirection = 自上而下
  • 保证金 = 0,0,0,0
  • 名称 = flow1
  • BackColor = 红色

FlowLayoutPanel 内部还有一个常规面板:

  • 保证金 = 0,0,0,0
  • 名称 = panel1
  • 背景颜色:蓝色

最后,一个间隔为 1 的计时器,它改变 FlowLayoutPanel 的宽度并在 FlowLayoutPanel 的 Horizo​​ntalScroll.Visibile 属性为 true 时禁用自身,并显示一个消息框,宣布 panel1 的宽度和 flow1 的 ClientSize.Width .

代码如下:

    private void timer1_Tick(object sender, EventArgs e)
    {
        flow1.Width -= 1;

        if (flow1.HorizontalScroll.Visible)
        {
            timer1.Enabled = false;
            MessageBox.Show("Panel.Width = " + panel1.Width.ToString() +
                ", FlowPanel.ClientWidth = " + flow1.ClientSize.Width.ToString());
        }
    }

    private void flow1_ClientSizeChanged(object sender, EventArgs e)
    {
        panel1.Width = flow1.ClientSize.Width;
    }

当没有孩子溢出客户端大小时,显示水平滚动条背后的逻辑是什么?最重要的是,如何防止它发生?

【问题讨论】:

    标签: c# resize scrollbar flowlayoutpanel


    【解决方案1】:

    这是一个事件顺序问题,布局计算得太快了。自动布局有几个讨厌的极端情况,它也可以是双稳态的,布局在两种解决方案之间来回翻转。您可以在您的测试应用中看到这一点,在 MessageBox.Show() 调用之前添加 flow1.PerformLayout();,您会看到滚动条再次隐藏。

    这就是SuspendLayout() 方法存在的原因。 Winforms 程序员用得还不够。有充分的理由,很难判断何时需要它。他们真的不想需要它。基本规则是,如果布局必须处理不止一种尺寸变化,您应该使用它。

    你的测试程序中真正的修复是什么:

    private void timer1_Tick(object sender, EventArgs e) {
        flow1.SuspendLayout();
        flow1.Width -= 1;
        flow1.ResumeLayout(true);
        // etc..
    }
    

    你会发现它现在工作得很好,你永远看不到消息框。

    【讨论】:

    • 感谢 Hans,这正是我正在寻找的解决方案。我现在要在我的主应用程序中尝试它,但它在测试应用程序中运行良好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 2013-07-06
    • 2012-04-05
    • 2014-12-08
    • 2010-12-15
    • 2012-07-13
    相关资源
    最近更新 更多