C# 滚动条仅显示第一个元素
我有一个非常简单的windows窗体。从下面的图片中可以看到,滚动条只出现在第一项中,但一旦我通过拖动边框使窗体变大,滚动条就会消失。这背后的原因是什么 表单的代码如下所示:C# 滚动条仅显示第一个元素,c#,winforms,scrollbar,tablelayoutpanel,C#,Winforms,Scrollbar,Tablelayoutpanel,我有一个非常简单的windows窗体。从下面的图片中可以看到,滚动条只出现在第一项中,但一旦我通过拖动边框使窗体变大,滚动条就会消失。这背后的原因是什么 表单的代码如下所示: var tlp1 = new TableLayoutPanel(); tlp1.Dock = DockStyle.Top; tlp1.AutoSize = true; tlp1.BackColor = Color.Bisque; var tlp2 = new TableLayoutPanel(); tlp2.Dock
var tlp1 = new TableLayoutPanel();
tlp1.Dock = DockStyle.Top;
tlp1.AutoSize = true;
tlp1.BackColor = Color.Bisque;
var tlp2 = new TableLayoutPanel();
tlp2.Dock = DockStyle.Fill;
tlp2.BackColor = Color.DarkSeaGreen;
page.Controls.Add(tlp2);
page.Controls.Add(tlp1);
for (var i = 0; i < 10; i++)
{
tlp1.Controls.Add(new TextBox()
{
Text = string.Format("page1. {0}", i)
});
tlp2.Controls.Add(new TextBox()
{
Text = string.Format("page2. {0}", i)
});
}
page.AutoScroll = true;
var tlp1=新的TableLayoutPanel();
tlp1.Dock=DockStyle.Top;
tlp1.AutoSize=true;
tlp1.BackColor=Color.Bisque;
var tlp2=新的TableLayoutPanel();
tlp2.Dock=DockStyle.Fill;
tlp2.BackColor=Color.DarkSeaGreen;
page.Controls.Add(tlp2);
页面控件添加(tlp1);
对于(变量i=0;i<10;i++)
{
tlp1.Controls.Add(新文本框()
{
Text=string.Format(“page1.{0}”,i)
});
tlp2.Controls.Add(新文本框()
{
Text=string.Format(“page2.{0}”,i)
});
}
page.AutoScroll=true;
可滚动区域将是LayoutEngine
排列后添加到ScollableContainer
的所有控件的最大值(x+宽度,y+高度)
由于tlp2.Dock=DockStyle.Fill
,其ClientRectangle(x、y、宽度、高度)是任何可用空间。换句话说,由于米色面板占据了所有可用高度,因此绿色面板客户端高度(ClientRectangle.height
)为零。当您增加主窗口的高度时,将有更多的空间可用,并且额外的高度将分配给绿色面板。但是,当设置为DockStyle.Fill
时,绿色面板不会满足空间需求
如果设置了以下各项:
tlp2.Dock = DockStyle.Bottom;
tlp2.AutoSize = true;
然后,您将有一个滚动条,它横跨两个面板的整个高度。或者另一种方法是将面板添加到垂直FlowLayoutPanel
,例如
class FormTab : Form {
public FormTab() {
TabControl tc = new TabControl { Dock = DockStyle.Fill };
TabPage page = new TabPage();
var tlp1 = new TableLayoutPanel();
tlp1.Dock = DockStyle.Top;
tlp1.AutoSize = true;
tlp1.BackColor = Color.Bisque;
var tlp2 = new TableLayoutPanel();
tlp2.Dock = DockStyle.Bottom;
tlp2.AutoSize = true;
tlp2.BackColor = Color.DarkSeaGreen;
VFLP p = new VFLP();
p.SuspendLayout();
p.Controls.Add(tlp2);
p.Controls.Add(tlp1);
page.Controls.Add(p);
//page.Controls.Add(tlp2);
//page.Controls.Add(tlp1);
for (var i = 0; i < 10; i++) {
tlp1.Controls.Add(new TextBox() {
Text = string.Format("page1. {0}", i)
});
tlp2.Controls.Add(new TextBox() {
Text = string.Format("page2. {0}", i)
});
}
this.DoubleClick += delegate {
Size s = page.GetPreferredSize(Size.Empty);
int bp = 1;
};
tc.TabPages.Add(page);
page.AutoScroll = true;
Controls.Add(tc);
p.ResumeLayout(true);
}
class VFLP : FlowLayoutPanel {
public VFLP() {
this.BackColor = Color.AliceBlue;
WrapContents = false;
FlowDirection = FlowDirection.TopDown;
AutoSize = true;
AutoSizeMode = AutoSizeMode.GrowAndShrink;
}
public override Size GetPreferredSize(Size proposedSize) {
Size s = base.GetPreferredSize(proposedSize);
Size s2 = Size.Empty;
foreach (Control c in Controls) {
Size s3 = c.GetPreferredSize(Size.Empty);
Padding m = c.Margin;
s2.Height += s3.Height + m.Vertical;
int w = s3.Width + m.Horizontal;
if (w > s2.Width)
s2.Width = w;
}
return s2;
}
}
}
类表单选项卡:表单{
公共表单选项卡(){
TabControl tc=new TabControl{Dock=DockStyle.Fill};
TabPage=新TabPage();
var tlp1=新的TableLayoutPanel();
tlp1.Dock=DockStyle.Top;
tlp1.AutoSize=true;
tlp1.BackColor=Color.Bisque;
var tlp2=新的TableLayoutPanel();
tlp2.Dock=DockStyle.Bottom;
tlp2.AutoSize=true;
tlp2.BackColor=Color.DarkSeaGreen;
VFLP=新的VFLP();
p、 SuspendLayout();
p、 控件。添加(tlp2);
p、 控制。添加(tlp1);
页。控件。添加(p);
//page.Controls.Add(tlp2);
//页面控件添加(tlp1);
对于(变量i=0;i<10;i++){
tlp1.Controls.Add(新文本框(){
Text=string.Format(“page1.{0}”,i)
});
tlp2.Controls.Add(新文本框(){
Text=string.Format(“page2.{0}”,i)
});
}
this.DoubleClick+=委托{
大小s=page.GetPreferredSize(Size.Empty);
int-bp=1;
};
tc.TabPages.Add(第页);
page.AutoScroll=true;
添加(tc);
p、 简历布局(真实);
}
VFLP类:FlowLayoutPanel{
公共VFLP(){
this.BackColor=Color.AliceBlue;
WrapContents=false;
FlowDirection=FlowDirection.TopDown;
AutoSize=true;
AutoSizeMode=AutoSizeMode.growthandshrink;
}
公共覆盖大小GetPreferredSize(大小proposedSize){
大小s=基本。GetPreferredSize(proposedSize);
大小s2=大小。空;
foreach(控件中的控件c){
大小s3=c.GetPreferredSize(大小为空);
填充m=c.边距;
s2.高度+=s3.高度+m.垂直;
int w=s3.宽度+m.水平;
如果(w>s2.宽度)
s2.宽度=w;
}
返回s2;
}
}
}
我相信您必须为TableLayoutPanel
设置AutoScroll=true
。@正如您所说的,Bauss设置将滚动条放在第二个面板内,如中所示。如果TLP的大小大于实际面板,您可以尝试与面板比较大小,然后强制打开滚动条。