【问题标题】:Making control docking and scrollbars play nicely使控件停靠和滚动条很好地发挥作用
【发布时间】:2011-12-29 22:00:42
【问题描述】:

我有一个面板,它有时需要比自然容纳更多的垂直屏幕空间,因此它需要能够垂直滚动。所以,一切都设置为 AutoScroll。

控件包含在 TableLayoutPanel 中并设置为停靠,因此它们应调整其宽度以匹配。然而,当控件触发滚动条时,它总是 最终会创建一个水平滚动条,即使被违反的控件没有最小宽度限制。它是根据先前的宽度创建水平滚动条,而不是尊重停靠命令并重新绘制控件以适应新的宽度。

有没有更好的办法解决这个问题?

【问题讨论】:

    标签: c# .net winforms autoscroll tablelayoutpanel


    【解决方案1】:

    是的,这是布局计算方式的必然结果。摆脱水平滚动条需要多次通过计算,但.NET 只通过一次。有一个很好的理由,布局可以是双稳态的,在两种状态之间来回切换。

    我真的不明白 TableLayoutPanel 在这里有什么用处,或者是什么让它成长。一般来说,只是不要停靠它,给它你想要填充面板的大小。可能是这样的:

        bool resizingTlp;
    
        private void tableLayoutPanel1_Resize(object sender, EventArgs e) {
            if (resizingTlp) return;
            resizingTlp = true;
            if (tableLayoutPanel1.Height <= panel1.ClientSize.Height) tableLayoutPanel1.Width  panel1.ClientSize.Width;
            else tableLayoutPanel1.Width = panel1.ClientSize.Width - SystemInformation.VerticalScrollBarWidth;
            resizingTlp = false;
        }
    

    【讨论】:

      【解决方案2】:

      试试这个:

      Outer panel:{AutoScroll=true, Dock=Fill}
      Inner panel:{Dock=Top,Width=customwidth}
      

      【讨论】:

      • 这对我有用。很好的解决方案,无需编写任何代码。
      • 在我的情况下它不起作用。 AutoScroll 和 Dock 填充在同一个面板中会使 AutoScroll 不起作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 2013-05-10
      • 2015-04-02
      相关资源
      最近更新 更多