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

如何实现WinForms中左右面板可缩放且中间窄面板保持居中?

WinForms三垂直面板布局解决方案

方法一:用TableLayoutPanel(推荐,无需手写过多代码)

  • 给窗体拖入一个TableLayoutPanel,设置它的Dock属性为Fill,让它铺满整个窗体客户区。
  • 把TableLayoutPanel的ColumnCount设为3,RowCount设为1,也就是一行三列的布局结构。
  • 调整列宽规则:选中中间列(第2列),在属性面板将Width的类型改成Absolute,输入你需要的固定宽度(比如200);左右两列(第1、3列)的Width类型改成Percent,值都设为50。这样左右列会自动平分窗体剩余的水平空间。
  • 将面板A、B、C分别拖入对应列中,每个面板都设置Dock为Fill。此时中间面板B会保持固定宽度且水平居中,高度随窗体自动拉伸;左右面板A、C会自动填充剩余空间,高度也同步适配窗体变化。

方法二:手动处理Resize事件(适合需要更灵活控制的场景)

如果不想用布局控件,直接通过代码计算位置和尺寸:

  1. 先给三个面板设置初始属性:
    • 面板B的Width设为固定值(比如200),不设置Dock属性。
    • 面板A和C同样不设置Dock属性。
  2. 在窗体的Resize事件中添加以下代码(记得在窗体加载时也执行一次,保证初始布局正确):
private void Form1_Resize(object sender, EventArgs e)
{
    SuspendLayout();
    // 计算中间面板B的位置和高度
    int panelBWidth = 200;
    panelB.Location = new Point((ClientSize.Width - panelBWidth) / 2, 0);
    panelB.Height = ClientSize.Height;

    // 设置左面板A的尺寸和位置
    panelA.Location = new Point(0, 0);
    panelA.Width = panelB.Left;
    panelA.Height = ClientSize.Height;

    // 设置右面板C的尺寸和位置
    panelC.Location = new Point(panelB.Right, 0);
    panelC.Width = ClientSize.Width - panelB.Right;
    panelC.Height = ClientSize.Height;
    ResumeLayout(false);
}
  • 注意用ClientSize而非Size,因为ClientSize是窗体实际可使用的客户区大小(排除标题栏、边框等占用的空间)。
  • 加上SuspendLayout()和ResumeLayout(false)可以避免布局过程中的控件闪烁问题。

内容的提问来源于stack exchange,提问作者agrarian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:10:30