You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 23:26:18