003003001_Grid控件

003003001_Grid控件

摘要:本文系统讲解 WPF 中最核心的布局控件 Grid,涵盖其继承链、类定义、三种尺寸模式(固定/Auto/星号)、附件属性绑定方式,以及标准使用步骤。通过基础登录表单、复杂界面分区、比例网格三个实战示例,演示实际应用场景,并深入解析共享尺寸(SharedSizeScope)这一高级特性,助力读者掌握 WPF 响应式布局的精髓。

GridWPF 中最核心、最常用、功能最强大的布局控件 ,它继承自 Panel 基类,是二维表格网格布局的标准实现,也是开发中替代 WinForms 窗体布局的首选容器(类似 HTML 的 Table + Div 混合布局模式)。

​ 结合你之前学习的 Panel 基类知识,Grid 是 Panel 最成熟的官方派生类,完美实现了测量 - 排列布局模型。


一、Grid 控件类定义

1. 完整继承链

csharp:

markdown 复制代码
System.Object
 └─ System.Windows.Threading.DispatcherObject
    └─ System.Windows.DependencyObject
       └─ System.Windows.Media.Visual
          └─ System.Windows.UIElement
             └─ System.Windows.FrameworkElement
                └─ System.Windows.Controls.Panel  ← 布局基类
                   └─ System.Windows.Controls.Grid  ← 网格布局控件

2. 官方类定义

csharp:

c# 复制代码
public class Grid : Panel, ISharedSizeScope
  • 密封 / 非抽象 :可以直接实例化使用(无需继承);
  • 继承 Panel:拥有子元素管理、可视化树、两步布局所有能力;
  • ISharedSizeScope :支持行列共享尺寸(高级特性);

3. 核心定位

​ Grid 是二维行列网格布局容器 ,将容器划分为任意行、任意列的单元格,子元素通过附加属性 指定所在单元格,支持跨行、跨列、比例缩放、自适应,是 WPF 响应式布局的核心。


二、Grid 核心功能(必掌握)

1. 二维网格布局

​ 将容器划分为 行(Row)+ 列(Column) 的表格结构,精准控制子元素位置。

2. 三种行高 / 列宽定义模式(核心特性)

​ Grid 最大的优势是支持灵活的尺寸规则,这是它优于其他布局控件的关键:

取值类型 语法 含义
固定值 50 / 100px 固定像素大小,不随容器变化
自适应 Auto 根据子元素内容自动计算宽高(内容多大,单元格多大)
比例值 * / 2* / 3* 按比例分配剩余空间(星号布局)

3. 跨行 / 跨列

​ 子元素可以跨越多个行 / 列(Grid.RowSpan / Grid.ColumnSpan),实现合并单元格效果。

4. 响应式布局

​ 配合比例星号(*),容器大小变化时,网格自动等比缩放,适配不同窗口尺寸。

5. 共享尺寸

​ 不同 Grid 的行列可以共享同一尺寸(多用于表单对齐、多区域统一布局)。

6. 辅助调试

ShowGridLines="True" 显示网格分割线,方便布局调试。


三、Grid 核心属性 + 附加属性

1. Grid 自身属性(容器级)

属性名 类型 作用
RowDefinitions RowDefinitionCollection 定义行集合(设置每一行高度)
ColumnDefinitions ColumnDefinitionCollection 定义列集合(设置每一列宽度)
ShowGridLines bool 是否显示网格调试线(默认 false)
Background Brush 网格背景画刷
Margin/Padding Thickness 外边距 / 内边距

2. 附加属性(子元素用,核心)

附加属性由 Grid 定义,子元素挂载使用 ,索引从 0 开始

附加属性 作用 默认值
Grid.Row 指定子元素所在行 0
Grid.Column 指定子元素所在列 0
Grid.RowSpan 子元素跨行数量 1
Grid.ColumnSpan 子元素跨列数量 1

四、Grid 标准使用步骤(通用规范)

  1. 声明 Grid 容器
  2. 定义行(RowDefinitions)和列(ColumnDefinitions)
  3. 给子元素设置附加属性,指定行列
  4. 配置跨行 / 跨列、对齐、边距
  5. 调试完成后隐藏网格线

五、实战代码实例(可直接复制运行)

实例 1:基础登录表单(最常用场景)

​ 实现用户名、密码、登录按钮的标准表单布局,演示 Auto + * 尺寸。

xaml:

xaml 复制代码
<Window x:Class="GridDemo.LoginWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Grid登录表单" Height="250" Width="400">
    <!-- 1. 定义Grid容器,显示调试线 -->
    <Grid ShowGridLines="True" Margin="20">
        <!-- 2. 定义3行:行高=自适应(Auto) -->
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <!-- 定义2列:左列自适应,右列占满剩余空间 -->
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <!-- 3. 第一行:用户名 -->
        <TextBlock Text="用户名:" Grid.Row="0" Grid.Column="0" 
                   VerticalAlignment="Center" Margin="0 0 10 10"/>
        <TextBox Grid.Row="0" Grid.Column="1" Margin="0 0 0 10"/>

        <!-- 第二行:密码 -->
        <TextBlock Text="密 码:" Grid.Row="1" Grid.Column="0" 
                   VerticalAlignment="Center" Margin="0 0 10 10"/>
        <PasswordBox Grid.Row="1" Grid.Column="1" Margin="0 0 0 10"/>

        <!-- 第三行:登录按钮(跨2列) -->
        <Button Content="登录" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" 
                Height="35" Background="#0078D7" Foreground="White"/>
    </Grid>
</Window>

实例 2:复杂界面分区(顶部 + 左侧 + 主内容 + 底部)

​ 演示比例布局 + 跨行跨列,实现标准后台管理界面布局:

xaml:

xaml 复制代码
<Window x:Class="GridDemo.MainInterface"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Grid复杂界面" Height="450" Width="600">
    <Grid>
        <!-- 3行2列:顶部固定、底部固定、中间比例 -->
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/>    <!-- 固定行高:顶部导航 -->
            <RowDefinition Height="*"/>     <!-- 比例行高:主内容区 -->
            <RowDefinition Height="30"/>    <!-- 固定行高:底部状态栏 -->
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="150"/> <!-- 固定列宽:左侧菜单 -->
            <ColumnDefinition Width="*"/>   <!-- 比例列宽:主内容 -->
        </Grid.ColumnDefinitions>

        <!-- 顶部导航:跨2列 -->
        <Border Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Background="#2D3748">
            <TextBlock Text="顶部导航栏" Foreground="White" FontSize="18" 
                       HorizontalAlignment="Center" VerticalAlignment="Center"/>
        </Border>

        <!-- 左侧菜单 -->
        <Border Grid.Row="1" Grid.Column="0" Background="#4A5568">
            <TextBlock Text="左侧菜单" Foreground="White" 
                       HorizontalAlignment="Center" VerticalAlignment="Center"/>
        </Border>

        <!-- 主内容区 -->
        <Border Grid.Row="1" Grid.Column="1" Background="White">
            <TextBlock Text="主内容区域" FontSize="20" 
                       HorizontalAlignment="Center" VerticalAlignment="Center"/>
        </Border>

        <!-- 底部状态栏:跨2列 -->
        <Border Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" Background="#E2E8F0">
            <TextBlock Text="底部状态栏 © 2026" Margin="10" VerticalAlignment="Center"/>
        </Border>
    </Grid>
</Window>

实例 3:比例网格(等比分配空间)

​ 演示 * 比例布局,实现 1:2:3 的三列等分效果:

xaml:

xaml 复制代码
<Window x:Class="GridDemo.ProportionGrid"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="比例网格" Height="200" Width="400">
    <Grid ShowGridLines="True">
        <!-- 1行3列,比例 1:2:3 -->
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="2*"/>
            <ColumnDefinition Width="3*"/>
        </Grid.ColumnDefinitions>

        <Border Grid.Column="0" Background="LightBlue" HorizontalAlignment="Stretch"/>
        <Border Grid.Column="1" Background="LightGreen" HorizontalAlignment="Stretch"/>
        <Border Grid.Column="2" Background="LightPink" HorizontalAlignment="Stretch"/>
    </Grid>
</Window>

六、Grid 高级特性:共享尺寸(进阶用法)

两个独立 Grid 的列宽保持一致,常用于表单对齐:

xaml:

xaml 复制代码
<StackPanel>
    <!-- 启用共享尺寸域 -->
    <StackPanel Grid.IsSharedSizeScope="True">
        <!-- 第一个Grid:列名共享尺寸 -->
        <Grid Margin="10">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" SharedSizeGroup="FormLabel"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <TextBlock Text="姓名:" Grid.Column="0"/>
            <TextBox Grid.Column="1"/>
        </Grid>

        <!-- 第二个Grid:自动对齐第一个Grid的列宽 -->
        <Grid Margin="10">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" SharedSizeGroup="FormLabel"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <TextBlock Text="联系电话:" Grid.Column="0"/>
            <TextBox Grid.Column="1"/>
        </Grid>
    </StackPanel>
</StackPanel>

解析上述代码:

这段代码的核心目的

两个独立的 Grid 控件 ,自动保持第一列标签宽度完全一致 (表单对齐),这是 WPF Grid 最实用的高级特性 ------共享尺寸(SharedSize)

xaml:

xaml 复制代码
<StackPanel>

解析

  • 最外层根布局容器,继承自 Panel
  • 默认垂直方向排列子元素(从上到下)
  • 作用:包裹内部所有内容,提供基础布局载体

xaml:

xaml 复制代码
    <!-- 启用共享尺寸域 -->

解析

  • XAML 注释,说明下一行代码的核心功能
  • 无实际运行效果,仅方便开发者阅读

xaml:

xaml 复制代码
    <StackPanel Grid.IsSharedSizeScope="True">

核心关键解析(共享尺寸总开关)

  1. 内层 StackPanel :作为共享尺寸的作用域容器

  2. Grid.IsSharedSizeScope="True"

    • 这是一个 Grid 定义的附加属性

    • 作用:开启共享尺寸范围,告诉 WPF:

      ✔️ 这个容器内的所有

      复制代码
      Grid

      ✔️ 可以共享相同名称的行列尺寸

    • 必须设置:不写这行,共享尺寸完全失效

    • 规则 :作用于所有目标 Grid 的共同父元素


xaml:

xaml 复制代码
        <!-- 第一个Grid:列名共享尺寸 -->

解析:注释,标记第一个表单行的 Grid


xaml:

xaml 复制代码
        <Grid Margin="10">

解析

  • 第一个网格布局容器
  • Margin="10":外边距 10 像素,和其他控件保持间距
  • 作用:承载第一行表单(姓名)

xaml:

xaml 复制代码
            <Grid.ColumnDefinitions>

解析

  • Grid列定义集合
  • 用于声明当前 Grid 有几列、每列多宽

xaml:

xaml 复制代码
                <ColumnDefinition Width="Auto" SharedSizeGroup="FormLabel"/>

核心解析(共享列)

  1. <ColumnDefinition>:定义第一列

  2. Width="Auto":列宽自适应子元素内容(文字多长,列多宽)

  3. SharedSizeGroup="FormLabel"

    • 共享尺寸分组名(自定义字符串)
    • 作用:标记这一列属于 FormLabel
    • 同组的所有列,会自动统一宽度(取组内最宽的列)

xaml:

xaml 复制代码
                <ColumnDefinition Width="*"/>

解析

  • 定义第二列
  • Width="*":占满剩余所有宽度(给文本框使用)

xaml:

xaml 复制代码
            </Grid.ColumnDefinitions>

解析:结束列定义


xaml:

xaml 复制代码
            <TextBlock Text="姓名:" Grid.Column="0"/>

解析

  • 标签文本:显示 "姓名:"
  • Grid.Column="0":附加属性,放在第一列(0 号列)

xaml:

xaml 复制代码
            <TextBox Grid.Column="1"/>

解析

  • 输入文本框
  • Grid.Column="1":放在第二列(1 号列)

xaml:

c# 复制代码
        </Grid>

解析:第一个 Grid 结束(姓名行完成)


xaml:

xaml 复制代码
        <!-- 第二个Grid:自动对齐第一个Grid的列宽 -->

解析:注释,标记第二个表单行 Grid


xaml:

xaml 复制代码
        <Grid Margin="10">

解析

  • 第二个独立 Grid
  • 承载第二行表单(联系电话)
  • 和第一个 Grid 没有嵌套关系,完全独立

xaml:

xaml 复制代码
            <Grid.ColumnDefinitions>

解析:第二个 Grid 的列定义


xaml:

c# 复制代码
                <ColumnDefinition Width="Auto" SharedSizeGroup="FormLabel"/>

核心解析(关键对齐)

  1. 第一列同样:Width="Auto"

  2. SharedSizeGroup="FormLabel"

    • 和第一个 Grid 的第一列组名完全相同
    • WPF 会自动让这两列宽度保持一致
    • 最终宽度 = 两组里最宽的内容宽度(这里是 "联系电话:")

xaml:

c# 复制代码
                <ColumnDefinition Width="*"/>

解析:第二列占满剩余宽度


xaml:

c# 复制代码
            </Grid.ColumnDefinitions>

解析:结束列定义


xaml:

c# 复制代码
            <TextBlock Text="联系电话:" Grid.Column="0"/>

解析:标签文字更长("联系电话:"),是决定共享列宽度的元素


xaml:

复制代码
            <TextBox Grid.Column="1"/>

解析:第二行输入框


xaml:

复制代码
        </Grid>
    </StackPanel>
</StackPanel>

解析:所有容器闭合标签


核心运行效果总结

没加共享尺寸时(错误效果)
  • 第一个 Grid 第一列:宽度 = 姓名: 的长度

  • 第二个 Grid 第一列:宽度 = 联系电话: 的长度

    两列宽度不一样,文本框错位,表单排版不整齐

加了共享尺寸后(正确效果)
  • 两个 Grid 的第一列组名相同

  • WPF 自动计算:取 ** 最宽的列(联系电话)** 作为统一宽度

    两列完全对齐,表单工整美观


3 个必须记住的核心规则

  1. Grid.IsSharedSizeScope="True"

    必须写在

    所有共享 Grid 的共同父元素

    上(总开关)

  2. SharedSizeGroup="组名"

    行列必须用

    相同自定义名称

    分组

  3. 配合 Width="Auto" / Height="Auto" 使用

    共享尺寸只对

    自适应尺寸

    生效


最终一句话总结

​ 这段代码通过 Grid 共享尺寸特性 ,让两个独立的表单行 Grid 实现了标签列自动对齐 ,是 WPF 开发中表单布局的标准最优方案


七、Grid 使用核心规范

  1. 默认规则 :不写 Grid.Row/Grid.Column,子元素默认在 第 0 行第 0 列
  2. 尺寸优先级:固定值 > 自适应 > 比例值;
  3. 性能 :Grid 性能优秀,适合绝大多数布局,优先使用 Grid 替代 StackPanel
  4. 嵌套:Grid 支持无限嵌套,复杂布局可分层嵌套实现;
  5. 调试 :开发时开启 ShowGridLines="True",发布后关闭。

八、总结

  1. 类定义 :Grid 是 Panel 的官方派生类,二维网格布局容器,可直接实例化;
  2. 核心能力:三种尺寸模式(固定 / Auto/*)、跨行跨列、响应式、共享尺寸;
  3. 核心用法:定义行列 → 子元素绑定附加属性;
  4. 地位 :WPF 第一布局控件,覆盖 90% 以上的界面开发场景;
  5. 优势:精准控制、响应式、易维护、适配所有窗口尺寸。

​ 一句话记忆:Grid = WPF 布局之王,用行列定义位置,用星号实现响应式!

相关推荐
十年磨剑走天涯1 小时前
C++ STL 容器操作复杂度速查表
开发语言·c++
always_TT1 小时前
【Python requirements.txt 依赖管理】
开发语言·python
Hi李耶1 小时前
【LeetCode】6-Z字形变换
算法·leetcode·职场和发展
ziguo11221 小时前
Windows API MessageBox 函数详解
c语言·c++·windows·visualstudio
15Moonlight1 小时前
C++进阶(09):特殊类设计
开发语言·c++
XiaoYu1__1 小时前
算法进阶·其一:用SCC、Tarjan算法与缩点思想解决有向图的连通关系及2-SAT问题的拓展
算法
小O的算法实验室1 小时前
AAAI-26,全局相关性学习:通过谱图神经网络增强进化算法
神经网络·学习·算法
宁风NF1 小时前
JavaScript:网络请求与前端通信
开发语言·前端·javascript·网络·学习·ecmascript
段一凡-华北理工大学2 小时前
AI推动工业智能化转型~系列文章07:分类与诊断算法体系:故障识别的完整工具箱
数据库·人工智能·算法·机器学习·分类·数据挖掘·高炉炼铁智能化