如何禁用WinForm中TableLayoutPanel的大小调整功能?
解决WinForm中TableLayoutPanel随窗口缩放变形的问题
问题根源
你设置了tableLayoutPanel1.Dock = DockStyle.Fill,这个属性会强制控件填充父容器的客户端区域,窗口调整大小时控件会自动拉伸填满,因此AutoSize = false不会生效——Dock的优先级高于AutoSize。
解决方案
方案1:取消Dock,设置固定最大/最小尺寸并居中
这是最直接的方式,让控件保持固定尺寸范围,不随窗口缩放:
- 移除Dock设置:删除
this.tableLayoutPanel1.Dock = DockStyle.Fill;,改用AnchorStyles.None让控件不随窗口缩放 - 设置尺寸限制:添加
MaxSize和MinSize属性,固定控件的最大/最小可显示尺寸 - 保持控件居中:在窗体的
Resize事件中调整控件位置,确保窗口变化时控件始终居中
修改后的代码片段
this.tableLayoutPanel1.ColumnCount = 2; this.tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F)); this.tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F)); // 取消Dock,设置锚点为None(不随窗口缩放) this.tableLayoutPanel1.Anchor = AnchorStyles.None; // 初始位置居中 this.tableLayoutPanel1.Location = new Point((this.ClientSize.Width - 682)/2, (this.ClientSize.Height - 598)/2); this.tableLayoutPanel1.Name = "tableLayoutPanel1"; this.tableLayoutPanel1.RowCount = 4; this.tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 10F)); this.tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 10F)); this.tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 35F)); this.tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 45F)); this.tableLayoutPanel1.Size = new Size(682, 598); // 设置最大尺寸,防止窗口放大时控件被拉伸 this.tableLayoutPanel1.MaxSize = new Size(682, 598); // 可选:设置最小尺寸,避免窗口缩小时控件过小 this.tableLayoutPanel1.MinSize = new Size(400, 300); this.tableLayoutPanel1.TabIndex = 0; //this.tableLayoutPanel1.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single; this.tableLayoutPanel1.Controls.Add(groupBox4, 0, 2); this.tableLayoutPanel1.Controls.Add(groupBox5, 1, 2); this.tableLayoutPanel1.Controls.Add(groupBox7, 0, 3); this.tableLayoutPanel1.Controls.Add(groupBox6, 1, 3); this.tableLayoutPanel1.Controls.Add(pictureBox1, 1, 0); this.tableLayoutPanel1.Controls.Add(label6, 0, 1); this.tableLayoutPanel1.SetColumnSpan(label6, 2); this.tableLayoutPanel1.AutoSize = false;
添加窗体Resize事件处理
在窗体的构造函数中绑定Resize事件:
public Form1() { InitializeComponent(); this.Resize += Form1_Resize; }
然后实现事件方法:
private void Form1_Resize(object sender, EventArgs e) { // 窗口调整时,重新计算控件位置使其居中 tableLayoutPanel1.Location = new Point( (this.ClientSize.Width - tableLayoutPanel1.Width) / 2, (this.ClientSize.Height - tableLayoutPanel1.Height) / 2 ); }
方案2:用Panel容器嵌套(支持滚动)
如果希望窗口缩小时控件能通过滚动条查看,可添加Panel作为容器:
- 在窗体上添加一个Panel控件,设置
panel1.Dock = DockStyle.Fill;和panel1.AutoScroll = true; - 将TableLayoutPanel的Dock改为None,设置固定尺寸,然后将其添加到Panel中
- 调整TableLayoutPanel在Panel中的位置,比如居中
补充说明
如果需要控件允许一定程度的缩放但不超过比例,可以将ColumnStyles/RowStyles中的SizeType.Percent改为混合SizeType.Absolute和SizeType.Percent,但这种方式不如固定最大尺寸直接。
内容的提问来源于stack exchange,提问作者Abhinav Kumar
相关产品推荐
相关产品推荐

