mcpField
S
syncfusion-winforms-layout-managers

syncfusion-winforms-layout-managers

github.com/syncfusion设计与 UI277 次安装1 周前更新
代码仓库

关于 syncfusion-winforms-layout-managers

面向 Syncfusion WinForms 开发者的布局管理技能,介绍五种基于容器的控件自动排布方式。涵盖边缘停靠、卡片切换、流式排列、均匀网格和可变网格布局。

主要功能

  1. 01提供五种容器布局管理器
  2. 02支持边缘区域停靠
  3. 03支持卡片式页面导航
  4. 04提供水平及垂直流式排列
  5. 05支持均匀与灵活网格
  6. 06包含代码和设计器配置指南

适用场景

  1. 01构建含页眉和侧栏的应用窗口
  2. 02实现多步骤向导页面
  3. 03排列可换行的工具栏按钮
  4. 04制作复杂表单或均匀按钮网格

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/syncfusion/winforms-ui-components-skills --skill syncfusion-winforms-layout-managers

安装后在 Claude Code 中输入/syncfusion-winforms-layout-managers确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
border-layout.md
card-layout.md
flow-layout.md
getting-started.md
grid-bag-layout.md
grid-layout.md

详细介绍

实现 Syncfusion WinForms 布局管理器

LayoutManagers Package 提供五种专用布局管理器,可根据特定布局策略自动排列容器控件(Panel、Form 等)中的子控件。这些管理器无需手动定位,并能提供专业且易于维护的布局。

何时使用此技能

用户需要以下功能时,请使用此技能:

  • 自动布局管理: 让布局管理器定位控件,而不是手动放置
  • BorderLayout(5 区域停靠): 将控件停靠到 North、South、East、West 或 Center 位置
  • CardLayout(向导/属性页): 在一组控件中一次显示一个(向导、选项卡式内容)
  • FlowLayout(流式排列): 水平或垂直排列控件,并自动换行
  • GridLayout(均匀网格): 将控件排列在单元格大小相同的均匀网格中
  • GridBagLayout(灵活网格): 创建单元格大小可变且控件可跨多个单元格的复杂布局
  • 基于容器的布局: 将布局应用于 Panel、Form 或任何 ContainerControl
  • 基于约束的定位: 定义布局规则,而不是使用绝对坐标
  • 响应式布局: 在容器调整大小时自动适应的布局
  • 专业表单: 创建一致且易于维护的表单布局

组件概览

LayoutManagers Package(Syncfusion.Windows.Forms.Tools)提供五种布局管理器:

1. BorderLayout

用途: 沿边框和中心停靠控件(类似 .NET 停靠)

主要功能:

  • 5 个区域:North、South、East、West、Center
  • 基于位置的约束
  • 间距控制(HGap、VGap)
  • 自定义各位置的大小

适用场景: MDI 风格界面、停靠面板以及带有页眉/页脚/侧边栏的应用程序外壳

2. CardLayout

用途: 一次显示一组控件中的一个子控件

主要功能:

  • 卡片堆栈(一次仅显示一张)
  • 导航(First、Last、Next、Previous)
  • 卡片命名/标识
  • 布局模式(Default、Fill)
  • 支持为每张卡片设置图像

适用场景: 向导、属性页、无选项卡的选项卡式内容、分步表单

3. FlowLayout

用途: 按水平或垂直方向流式排列控件(最常用)

主要功能:

  • 水平或垂直布局模式
  • 自动换行
  • 对齐选项(Near、Far、Center、ChildConstraints)
  • 每个子控件的约束(MinSize、PreferredSize)
  • 流动方向(正常、反向)
  • AutoHeight 功能

适用场景: 工具栏、按钮面板、标签列表、响应式内容,以及大多数通用布局

4. GridLayout

用途: 将控件排列在均匀网格中

主要功能:

  • 配置行和列
  • 单元格大小相同
  • 自动放置子控件
  • 间距控制(HGap、VGap)

适用场景: 计算器布局、按钮网格、统一图标面板、简单的表格布局

5. GridBagLayout

用途: 创建灵活网格构成的复杂布局

主要功能:

  • 行/列大小可变
  • 单元格跨行和跨列
  • 锚定位置(9 种选项)
  • 填充模式(None、Horizontal、Vertical、Both)
  • 基于权重调整大小(WeightX、WeightY)
  • 每个单元格的内边距(Insets)

适用场景: 复杂表单、对话框、单元格大小可变的布局以及高级定位需求

主要命名空间: Syncfusion.Windows.Forms.Tools

程序集: Syncfusion.Shared.Base.dll


文档与导航指南

入门

📄 阅读: references/getting-started.md

阅读时机: 用户需要安装组件、了解容器概念,或设置第一个布局管理器时。

涵盖主题:

  • 程序集部署和 NuGet 包
  • 容器控件概念(Panel、Form、ContainerControl)
  • 子控件管理
  • 通过设计器添加布局管理器
  • 通过代码添加布局管理器
  • 所有布局类型的基本设置
  • 常见设置(间距、间隙)
  • 布局事件
BorderLayout(5 区域停靠)

📄 阅读: references/border-layout.md

适合阅读的场景: 用户希望将控件停靠到边缘(North、South、East、West、Center)。

涵盖主题:

  • BorderLayout 概述和位置约束
  • 向各个位置添加控件
  • 设计器与代码实现方式
  • SetConstraints 方法
  • 间距配置(HGap、VGap)
  • 自定义各个位置的尺寸
  • MDI 风格布局示例
  • 停靠面板示例
  • BorderLayout 最佳实践
CardLayout(向导/堆栈)

📄 阅读: references/card-layout.md

适合阅读的场景: 用户需要向导、属性页或基于堆栈的导航。

涵盖主题:

  • CardLayout 概述(一次显示一张卡片)
  • 卡片命名和标识
  • 导航方法(First、Last、Next、Previous、ActivateCard)
  • LayoutMode(Default、Fill)
  • 各卡片的图像设置
  • 设计器用法(SelectedCard 属性)
  • 以编程方式管理卡片
  • 向导控件实现
  • 属性页实现
  • 完整的向导示例
  • 最佳实践
FlowLayout(流式排列)

📄 阅读: references/flow-layout.md

适合阅读的场景: 用户需要水平或垂直流式布局(最常见的用法)。

涵盖主题:

  • FlowLayout 概述(用途最广泛)
  • LayoutMode(Horizontal、Vertical)
  • 流向(正向、反向)
  • 对齐选项(Near、Far、Center、ChildConstraints)
  • 自动高度(AutoHeight)功能,实现换行
  • HGap 和 VGap 间距
  • 每个子项的约束(MinSize、PreferredSize)
  • SetConstraints 方法
  • 换行行为
  • 水平工具栏示例
  • 垂直侧边栏示例
  • 标签列表示例
  • 高级约束场景
  • 最佳实践
GridLayout(均匀网格)

📄 阅读: references/grid-layout.md

适合阅读的场景: 用户需要单元格大小相同的均匀网格。

涵盖主题:

  • GridLayout 概述
  • Rows 和 Columns 配置
  • 子项自动放置顺序
  • HGap 和 VGap 间距
  • 设计器与代码实现方式
  • 网格尺寸行为
  • 计算器布局示例
  • 按钮网格示例
  • 最佳实践
GridBagLayout(灵活网格)

📄 阅读: references/grid-bag-layout.md

适合阅读的场景: 用户需要单元格尺寸可变且控件可跨单元格的复杂布局。

涵盖主题:

  • GridBagLayout 概述(功能最强大)
  • 虚拟网格概念(行/列尺寸可变)
  • GridBagConstraints 配置
  • Anchor 属性(North、South、East、West、Center、NorthEast、NorthWest、SouthEast、SouthWest)
  • Fill 属性(None、Horizontal、Vertical、Both)
  • CellSpan(RowSpan、ColSpan)
  • WeightX 和 WeightY(调整尺寸时的分配权重)
  • Insets(单元格内边距)
  • 表单布局示例
  • 计算器布局示例
  • 高级跨单元格场景
  • 最佳实践

布局类型选择指南

根据需求选择布局:

需求推荐布局原因
停靠到边缘(页眉/页脚/侧边栏)BorderLayout简单的 5 区域定位
向导或多步骤表单CardLayout一次显示一张卡片,并支持导航
水平按钮工具栏FlowLayout(Horizontal)自动换行、间距灵活
垂直侧边栏或列表FlowLayout(Vertical)自动换行、间距灵活
计算器或键盘GridLayout 或 GridBagLayout均匀网格或灵活网格
包含标签/字段的复杂表单GridBagLayout单元格尺寸可变,支持跨单元格和对齐
简单表格布局(单元格大小相同)GridLayout行列均匀
通用响应式布局FlowLayout用途最广泛,适用范围广

快速入门示例

BorderLayout:停靠到边缘
using Syncfusion.Windows.Forms.Tools;

// Create BorderLayout
BorderLayout borderLayout = new BorderLayout();
borderLayout.ContainerControl = panel1; // Panel as container

// Create controls for each position
Label northLabel = new Label { Text = "Header", BackColor = Color.LightBlue };
Label southLabel = new Label { Text = "Footer", BackColor = Color.LightGray };
Label eastLabel = new Label { Text = "Right", BackColor = Color.LightYellow };
Label westLabel = new Label { Text = "Left", BackColor = Color.LightGreen };
Panel centerPanel = new Panel { BackColor = Color.White };

// Add controls to container
panel1.Controls.Add(northLabel);
panel1.Controls.Add(southLabel);
panel1.Controls.Add(eastLabel);
panel1.Controls.Add(westLabel);
panel1.Controls.Add(centerPanel);

// Set constraints (position each control)
borderLayout.SetPosition(northLabel, BorderPosition.North)
borderLayout.SetPosition(southLabel, BorderPosition.South);
borderLayout.SetPosition(eastLabel, BorderPosition.East);
borderLayout.SetPosition(westLabel, BorderPosition.West);
borderLayout.SetPosition(centerPanel, BorderPosition.Center);

// Configure spacing
borderLayout.HGap = 5;
borderLayout.VGap = 5;
CardLayout:向导页面
// Create CardLayout
CardLayout cardLayout = new CardLayout();
cardLayout.ContainerControl = panel1;

// Create wizard pages
Panel page1 = new Panel { BackColor = Color.AliceBlue };
Label label1 = new Label { Text = "Step 1: Welcome", Dock = DockStyle.Fill };
page1.Controls.Add(label1);

Panel page2 = new Panel { BackColor = Color.Honeydew };
Label label2 = new Label { Text = "Step 2: Configure", Dock = DockStyle.Fill };
page2.Controls.Add(label2);

Panel page3 = new Panel { BackColor = Color.LavenderBlush };
Label label3 = new Label { Text = "Step 3: Finish", Dock = DockStyle.Fill };
page3.Controls.Add(label3);

// Add pages to container
panel1.Controls.Add(page1);
panel1.Controls.Add(page2);
panel1.Controls.Add(page3);

// Name each card
cardLayout.SetCardName(page1, "Welcome");
cardLayout.SetCardName(page2, "Configure");
cardLayout.SetCardName(page3, "Finish");

// Navigation
cardLayout.LayoutMode = CardLayoutMode.Fill; // Fill container
cardLayout.First();  // Show first card

// Navigate programmatically
// cardLayout.Next();   // Next card
// cardLayout.Previous(); // Previous card
// cardLayout.ActivateCard("Configure"); // Jump to specific card
FlowLayout:水平工具栏
// Create FlowLayout
FlowLayout flowLayout = new FlowLayout();
flowLayout.ContainerControl = panel1;
flowLayout.LayoutMode = FlowLayoutMode.Horizontal;
flowLayout.Alignment = FlowAlignment.Near;
flowLayout.HGap = 10;
flowLayout.VGap = 5;

// Add buttons
for (int i = 1; i <= 8; i++)
{
    Button btn = new Button { Text = $"Button {i}", Size = new Size(80, 30) };
    panel1.Controls.Add(btn);
}

// Buttons will flow horizontally and wrap to next line automatically
GridLayout:按钮网格
// Create GridLayout (3x3 grid)
GridLayout gridLayout = new GridLayout();
gridLayout.ContainerControl = panel1;
gridLayout.Rows = 3;
gridLayout.Columns = 3;
gridLayout.HGap = 5;
gridLayout.VGap = 5;

// Add 9 buttons (automatic placement in grid)
for (int i = 1; i <= 9; i++)
{
    Button btn = new Button { Text = i.ToString() };
    panel1.Controls.Add(btn);
}
GridBagLayout:表单布局
// Create GridBagLayout
GridBagLayout gridBagLayout = new GridBagLayout();
gridBagLayout.ContainerControl = panel1;

// Create form controls
Label nameLabel = new Label { Text = "Name:", AutoSize = true };
TextBox nameTextBox = new TextBox { Width = 200 };
Label emailLabel = new Label { Text = "Email:", AutoSize = true };
TextBox emailTextBox = new TextBox { Width = 200 };
Button submitButton = new Button { Text = "Submit" };

// Add to container
panel1.Controls.Add(nameLabel);
panel1.Controls.Add(nameTextBox);
panel1.Controls.Add(emailLabel);
panel1.Controls.Add(emailTextBox);
panel1.Controls.Add(submitButton);

// Create constraints
GridBagConstraints labelConstraints = new new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, AnchorTypes.East, FillType.Horizontal, new Insets(5,5,5,5), 0, 0, false);
labelConstraints.Anchor = GridBagAnchor.East; // Align right

GridBagConstraints fieldConstraints = new GridBagConstraints(1, 0, 1, 1);
fieldConstraints.Fill = GridBagFill.Horizontal;
fieldConstraints.WeightX = 1; // Take extra horizontal space

// Apply constraints
gridBagLayout.SetConstraints(nameLabel, new new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, AnchorTypes.East, FillType.Horizontal, new Insets(5,5,5,5), 0, 0, false));
gridBagLayout.SetConstraints(nameTextBox, new new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, AnchorTypes.East, FillType.Horizontal, new Insets(5,5,5,5), 0, 0, false) {WeightX = 1 });
gridBagLayout.SetConstraints(emailLabel, new new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, AnchorTypes.East, FillType.Horizontal, new Insets(5,5,5,5), 0, 0, false));
gridBagLayout.SetConstraints(emailTextBox, new new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, AnchorTypes.East, FillType.Horizontal, new Insets(5,5,5,5), 0, 0, false){ WeightX = 1 });
gridBagLayout.SetConstraints(submitButton, new new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, AnchorTypes.East, FillType.Horizontal, new Insets(5,5,5,5), 0, 0, false));

常见模式

应用程序框架(BorderLayout)
// Header + Footer + Sidebar + Content area
BorderLayout borderLayout = new BorderLayout();
borderLayout.ContainerControl = this; // Form as container
borderLayout.HGap = 0;
borderLayout.VGap = 0;

Panel header = new Panel { Height = 60, BackColor = Color.Navy };
Panel footer = new Panel { Height = 30, BackColor = Color.Gray };
Panel sidebar = new Panel { Width = 200, BackColor = Color.LightGray };
Panel content = new Panel { BackColor = Color.White };

this.Controls.AddRange(new Control[] { header, footer, sidebar, content });

borderLayout.SetPosition(header, BorderPosition.North);
borderLayout.SetPosition(footer, BorderPosition.South);
borderLayout.SetPosition(sidebar, BorderPosition.West);
borderLayout.SetPosition(content, BorderPosition.Center);

适用场景: 带有固定页眉/页脚和侧边栏的主应用程序窗口。

多步骤向导(CardLayout)

参见上方的快速入门示例。添加“下一步”/“上一步”按钮,以便在向导步骤之间导航。

响应式工具栏(FlowLayout)

参见上方的快速入门示例。窗口大小调整时,按钮会自动换行。

登录表单(GridBagLayout)
// Labels in column 0, fields in column 1
// Submit button spans both columns
// All elements properly aligned and spaced

完整示例请参见 GridBagLayout 参考文档。


关键属性

所有布局的通用属性
属性类型描述
ContainerControlControl应用布局的容器(Panel、Form)
BorderLayout
属性类型描述
HGapint区域之间的水平间距
VGapint区域之间的垂直间距
CardLayout
属性类型描述
LayoutModeCardLayoutModeDefault 或 Fill
SelectedCardControl当前可见的卡片(设计器)
FlowLayout
属性类型描述
LayoutModeFlowLayoutModeHorizontal 或 Vertical
AlignmentFlowAlignmentNear、Far、Center、ChildConstraints
ReverseRowsbool反转流动方向
AutoHeightbool自动调整高度以适应换行
HGapint控件之间的水平间距
VGapint控件之间的垂直间距
GridLayout
属性类型描述
Rowsint行数
Columnsint列数
HGapint单元格之间的水平间距
VGapint单元格之间的垂直间距
GridBagLayout
属性类型描述
(Constraints set per child)GridBagConstraints参见 GridBagLayout 参考文档

常见使用场景

1. 应用程序主窗口

场景: 页眉、页脚、侧边栏和内容区域。

  • 使用 BorderLayout
  • North:页眉,South:页脚,West:侧边栏,Center:内容
  • 阅读:border-layout.md
2. 设置向导

场景: 多步骤配置向导。

  • 使用 CardLayout
  • 每张卡片对应一个步骤,使用“下一步”/“上一步”按钮导航
  • 阅读:card-layout.md
3. 自动换行工具栏

场景: 换行到下一行的水平工具栏。

  • 使用 FlowLayout(Horizontal 模式)
  • 设置 AutoHeight = true
  • 阅读:flow-layout.md
4. 计算器键盘

场景: 4x4 按钮网格。

5. 数据录入表单

场景: 标签在左,字段在右。

  • 使用 GridBagLayout
  • 第 0 列:标签(右对齐),第 1 列:字段(水平填充)
  • 阅读:grid-bag-layout.md
6. 标签云

场景: 自动排列并换行的标签。

  • 使用 FlowLayout(Horizontal 模式)
  • 动态添加 Label 控件
  • 阅读:flow-layout.md

事件

常见布局事件:

  • LayoutComplete - 布局重新计算完成时触发
flowLayout.LayoutComplete += (sender, e) => {
    // Layout has been recalculated
};

最佳实践

  1. 布局选择: 使用上方的选择指南,选择合适的布局类型
  2. 容器要求: 始终设置 ContainerControl 属性(Panel、Form)
  3. 添加子控件的顺序: 在设置约束之前,先将子控件添加到容器中
  4. 大多数情况下使用 FlowLayout: 不确定时,从 FlowLayout 开始(适用性最广)
  5. 复杂表单使用 GridBagLayout: 用于专业的数据录入表单
  6. 保持间距一致: 使用 HGap/VGap 保持间距一致
  7. 设计器支持: 使用设计器快速制作原型,使用代码实现动态布局
  8. 约束对象: 对类似控件重复使用 GridBagConstraints 对象
  9. 测试调整大小: 始终在不同容器大小下测试布局
  10. 文档: 为约束配置添加注释,以便维护

另请参阅

评论

支持 Markdown