003005001_StackPanel控件摘要StackPanel是 WPF 中最基础的线性布局面板继承自Panel核心职责是按单一方向垂直或水平依次堆叠子元素。本文从官方类定义与继承结构出发系统梳理其核心特性、唯一关键属性Orientation、底层 Measure/Arrange 两步布局原理、XAML 与 C# 两种使用方式以及拉伸填充、溢出滚动等新手必看细节同时与 Grid、WrapPanel 等面板横向对比给出推荐与避免使用的场景清单最后通过登录表单和工具栏两个完整实战示例帮助读者从理论直达可运行代码。StackPanel是 WPF最简洁、最基础、最常用的线性布局面板继承自Panel基类是所有线性排列布局的首选控件。 它的核心逻辑只有一句话将子元素按照 垂直 / 水平 单一方向依次 “堆叠” 排列一个挨着一个不换行、不重叠。一、官方类定义与继承结构1. 核心类声明源码级csharppublicclassStackPanel:Panel公开类可直接实例化、可继承自定义非密封类支持扩展直接继承Panel拥有子元素管理、可视化树、布局系统全部能力无额外接口结构极简仅实现基础线性堆叠2. 完整继承链WPF 标准层级Object └─ DispatcherObjectUI线程绑定 └─ DependencyObject依赖属性系统 └─ Visual渲染/命中测试 └─ UIElement基础布局/事件 └─ FrameworkElement样式/绑定/生命周期 └─ Panel子元素容器/布局契约 └─ StackPanel线性堆叠布局3. 官方核心定位用于在单行或单列中排列子元素的基础布局容器是 WPF 布局系统的「基础砖块」。二、StackPanel 核心特性必背单向排列仅支持垂直默认或水平一个方向依次堆叠子元素按添加顺序一个紧接一个排列不会自动换行内容超出容器边界会直接截断无滚动无比例分配不像 Grid 支持*占比尺寸由子元素自身决定自适应尺寸垂直堆叠宽度 最宽子元素宽度高度 所有子元素高度之和水平堆叠高度 最高子元素高度宽度 所有子元素宽度之和结构极简无行列定义零复杂配置开箱即用三、核心属性全部掌握即可精通StackPanel 配置极少核心属性只有 1 个其余为通用布局属性1. 【唯一核心属性】Orientation排列方向属性值说明默认值Vertical垂直堆叠从上到下✅ 默认Horizontal水平堆叠从左到右-xaml !-- 垂直排列默认可省略 -- StackPanel OrientationVertical !-- 水平排列 -- StackPanel OrientationHorizontal2. 通用布局属性继承自 Panel/FrameworkElement属性作用Children子元素集合所有布局面板核心Background面板背景画刷Margin面板外边距Padding面板内边距子元素与边框间距HorizontalAlignment水平对齐左 / 中 / 右 / 拉伸VerticalAlignment垂直对齐上 / 中 / 下 / 拉伸四、底层布局原理Measure Arrange 所有 WPF 布局都遵循两步布局法StackPanel 的实现最简洁第一步测量阶段MeasureOverride遍历所有子元素让每个子元素计算自己的大小垂直模式总宽度 所有子元素中最大宽度总高度 所有子元素高度累加水平模式总高度 所有子元素中最大高度总宽度 所有子元素宽度累加向父容器报告自己需要的尺寸第二步排列阶段ArrangeOverride按子元素添加顺序依次定位垂直模式从上到下每个子元素的Y 坐标是上一个元素的底部位置水平模式从左到右每个子元素的X 坐标是上一个元素的右侧位置不处理溢出超出容器边界的内容会被裁剪五、标准使用方法XAML C#方式 1XAML 使用推荐主流开发① 默认垂直堆叠最常用表单、列表xaml:StackPanelMargin10BackgroundWhite!--从上到下依次排列--TextBlockText用户名/TextBoxHeight30Margin0 5/TextBlockText密码/PasswordBoxHeight30Margin0 5/ButtonContent登录Height35Background#0078D7//StackPanel② 水平堆叠导航栏、按钮组xaml:StackPanelOrientationHorizontalMargin10BackgroundLightGray!--从左到右依次排列--ButtonContent首页Margin2/ButtonContent产品Margin2/ButtonContent关于Margin2/ButtonContent我的Margin2//StackPanel方式 2C# 后台代码创建// 1. 创建实例StackPanelstackPanelnewStackPanel();// 2. 设置方向水平stackPanel.OrientationOrientation.Horizontal;// 3. 添加子元素stackPanel.Children.Add(newButton{Content按钮1});stackPanel.Children.Add(newButton{Content按钮2});// 4. 添加到窗口this.ContentstackPanel;六、关键使用细节新手必看1. 子元素拉伸填充 StackPanel默认不会让子元素填充剩余空间需要手动设置xaml !-- 垂直StackPanel中让控件宽度填满 -- TextBox HorizontalAlignmentStretch/ !-- 水平StackPanel中让控件高度填满 -- Button VerticalAlignmentStretch/2. 溢出处理内容超出容器 StackPanel不会自动换行 / 滚动超出部分直接隐藏解决方案xaml:!-- 包裹 ScrollViewer 实现滚动 -- ScrollViewer VerticalScrollBarVisibilityAuto StackPanel !-- 大量子元素 -- /StackPanel /ScrollViewer3. 间距控制元素之间间距使用子元素的Margin整体内边距使用 StackPanel 的Padding4. 常见问题与排查问题一子元素不显示或尺寸异常问题现象明明在 XAML 中添加了子控件但界面上看不到它们或者控件的宽度/高度显示为 0变得扁了或没了。原因分析错误地混用了垂直和水平堆叠方向下的尺寸逻辑。例如在垂直StackPanel中放入一个特宽图片却期望它按水平方向自适应或者忘记设置固定尺寸导致控件本身尺寸为零。解决方案垂直StackPanel中子元素宽度默认取最宽子元素宽度每个子元素的高度必须由自身决定如设置Height、MinHeight或内部内容撑开。水平StackPanel中子元素高度默认取最高子元素高度每个子元素的宽度必须由自身决定如设置Width、MinWidth或内部内容撑开。若子元素尺寸仍然异常检查该子元素自身是否显式设置了Width0或Height0或被父级容器的ClipToBounds裁剪。问题二内容超出容器后无法滚动问题现象在StackPanel中放置了较多子元素如 50 个按钮超出窗口或父容器边界的内容直接被截断看不到也没有出现滚动条。原因分析StackPanel本身不具备自动滚动能力它只是简单地把所有子元素按照方向排列下去超出部分默认被容器裁剪。解决方案在StackPanel外层包裹一个ScrollViewer并设置对应的滚动条可见性ScrollViewer VerticalScrollBarVisibilityAuto StackPanel !-- 大量子元素 -- /StackPanel /ScrollViewer若为水平超出则设置HorizontalScrollBarVisibilityAuto。问题三期望的拉伸填充未生效问题现象将子控件的HorizontalAlignment或VerticalAlignment设为Stretch但控件并没有填满StackPanel的可用空间仍然保持原始大小或仅靠一侧对齐。原因分析在垂直StackPanel中每个子元素的高度由自身内容决定VerticalAlignmentStretch对高度无效。在水平StackPanel中每个子元素的宽度由自身内容决定HorizontalAlignmentStretch对宽度无效。若将StackPanel嵌套在另一个StackPanel内部外层可能没有给内层足够的空间导致Stretch无法生效。解决方案垂直StackPanel想让子控件横向填满设置HorizontalAlignmentStretch纵向填满需改用Grid等支持比例分配的容器。水平StackPanel想让子控件纵向填满设置VerticalAlignmentStretch横向填满需改用Grid。确保StackPanel自身的Width/Height或父容器的空间足够否则Stretch也没有空间可以拉伸。七、StackPanel VS 其他布局面板核心区别 结合你学过的Grid/UniformGrid一眼区分使用场景控件排列方式复杂度适用场景StackPanel单向线性堆叠极低简单垂直 / 水平排列、表单、导航栏Grid二维网格行 列高复杂界面、表单对齐、响应式布局UniformGrid等大单元格网格低九宫格、计算器、等尺寸按钮WrapPanel线性自动换行低标签流、图片墙StackPanel 升级版八、适用场景 ✅ 禁用场景 ❌✅ 推荐使用简单垂直表单登录 / 注册水平导航栏、工具栏按钮组列表项内部布局结构极简无行列定义零复杂配置开箱即用作为复杂布局的子容器嵌套使用❌ 避免使用 / 不适用场景复杂二维界面用 Grid需要等比例分配空间用 Grid/UniformGrid需要自动换行用 WrapPanel高性能大数据列表用 ListBox/ListView九、官方自定义规范继承 StackPanel如果你需要扩展 StackPanel遵循微软官方规范直接继承StackPanel不继承Panel重写MeasureOverride/ArrangeOverride必须调用base.方法扩展属性用依赖属性不破坏原生线性堆叠逻辑csharp:// 官方规范自定义 StackPanel带间距publicclassCustomStackPanel:StackPanel{// 依赖属性注册 MeasureOverride/ArrangeOverride 重写}十、总结极简核心记忆类定义StackPanel : PanelWPF 最基础线性布局面板核心能力垂直 / 水平 单向依次堆叠不会自动换行、不重叠唯一核心属性Orientation控制排列方向布局规则垂直宽取最大高累加水平高取最大宽累加使用口诀简单线性用 Stack复杂网格用 Grid等大格子用 Uniform自动换行用 Wrap十一、实战演练示例 1垂直登录表单XAML 方式一个典型的登录界面使用垂直StackPanel完成用户名、密码输入框和登录按钮的布局。注意子控件的Margin、HorizontalAlignment等属性让界面更整齐。!-- 登录表单界面 -- StackPanel OrientationVertical Margin30 BackgroundWhite Width300 !-- 标题 -- TextBlock Text用户登录 FontSize20 FontWeightBold HorizontalAlignmentCenter Margin0 0 0 20/ !-- 用户名行 -- StackPanel OrientationHorizontal Margin0 0 0 10 TextBlock Text用户名 VerticalAlignmentCenter Width60/ TextBox x:NametxtUsername Width200 Height28 VerticalContentAlignmentCenter/ /StackPanel !-- 密码行 -- StackPanel OrientationHorizontal Margin0 0 0 20 TextBlock Text密 码 VerticalAlignmentCenter Width60/ PasswordBox x:NametxtPassword Width200 Height28 VerticalContentAlignmentCenter/ /StackPanel !-- 登录按钮 -- Button Content登录 Height35 Width100 Background#0078D7 ForegroundWhite FontWeightBold HorizontalAlignmentCenter ClickLoginButton_Click/ /StackPanel对应的后台事件处理在窗口代码后置文件中privatevoidLoginButton_Click(objectsender,RoutedEventArgse){stringusernametxtUsername.Text;stringpasswordtxtPassword.Password;if(!string.IsNullOrWhiteSpace(username)!string.IsNullOrWhiteSpace(password)){MessageBox.Show($欢迎{username},登录成功,MessageBoxButton.OK,MessageBoxImage.Information);}else{MessageBox.Show(请输入用户名和密码,提示,MessageBoxButton.OK,MessageBoxImage.Warning);}}示例 2带图标工具栏水平 垂直嵌套XAML 方式构建一个水平工具栏每个工具项内部使用垂直StackPanel将图标按钮和文本标签组合在一起。!-- 工具栏界面 -- StackPanel OrientationHorizontal Margin10 Background#F0F0F0 Height60 !-- 新建按钮组 -- StackPanel OrientationVertical Margin5 0 HorizontalAlignmentCenter Width60 Button Content FontSize16 Width40 Height40 HorizontalAlignmentCenter BackgroundTransparent BorderThickness0 ToolTip新建文档 ClickNewButton_Click/ TextBlock Text新建 HorizontalAlignmentCenter FontSize11/ /StackPanel !-- 打开按钮组 -- StackPanel OrientationVertical Margin5 0 HorizontalAlignmentCenter Width60 Button Content FontSize16 Width40 Height40 HorizontalAlignmentCenter BackgroundTransparent BorderThickness0 ToolTip打开文件 ClickOpenButton_Click/ TextBlock Text打开 HorizontalAlignmentCenter FontSize11/ /StackPanel !-- 保存按钮组 -- StackPanel OrientationVertical Margin5 0 HorizontalAlignmentCenter Width60 Button Content FontSize16 Width40 Height40 HorizontalAlignmentCenter BackgroundTransparent BorderThickness0 ToolTip保存文件 ClickSaveButton_Click/ TextBlock Text保存 HorizontalAlignmentCenter FontSize11/ /StackPanel /StackPanel对应的后台事件处理privatevoidNewButton_Click(objectsender,RoutedEventArgse){MessageBox.Show(新建文档功能。,提示);}privatevoidOpenButton_Click(objectsender,RoutedEventArgse){MessageBox.Show(打开文件功能。,提示);}privatevoidSaveButton_Click(objectsender,RoutedEventArgse){MessageBox.Show(保存文件功能。,提示);}示例 3C# 后台代码动态构建工具栏如果希望在代码中动态创建上述工具栏例如根据配置文件生成按钮可以这样做publicvoidBuildToolbar(){// 创建外层水平 StackPanelvartoolbarnewStackPanel{OrientationOrientation.Horizontal,MarginnewThickness(10),BackgroundnewSolidColorBrush(Color.FromRgb(240,240,240)),Height60};// 批量添加按钮AddToolItem(toolbar,,新建,(s,e)ShowMessage(新建文档功能。));AddToolItem(toolbar,,打开,(s,e)ShowMessage(打开文件功能。));AddToolItem(toolbar,,保存,(s,e)ShowMessage(保存文件功能。));// 将工具栏添加到窗口或容器例如 Grid 的某一行this.Contenttoolbar;}privatevoidAddToolItem(StackPanelparent,stringicon,stringlabel,RoutedEventHandlerclickHandler){// 每个工具项一个垂直 StackPanelvaritemnewStackPanel{OrientationOrientation.Vertical,MarginnewThickness(5,0,5,0),HorizontalAlignmentHorizontalAlignment.Center,Width60};varbuttonnewButton{Contenticon,FontSize16,Width40,Height40,HorizontalAlignmentHorizontalAlignment.Center,BackgroundBrushes.Transparent,BorderThicknessnewThickness(0),ToolTip${label}操作};button.ClickclickHandler;vartextnewTextBlock{Textlabel,HorizontalAlignmentHorizontalAlignment.Center,FontSize11};item.Children.Add(button);item.Children.Add(text);parent.Children.Add(item);}privatevoidShowMessage(stringmsg){MessageBox.Show(msg,提示);}以上两个实战示例覆盖了StackPanel的垂直、水平以及嵌套使用方式并分别给出了 XAML 声明式写法和 C# 后台代码写法可直接复制到 WPF 项目中运行。
003005001_StackPanel控件
003005001_StackPanel控件摘要StackPanel是 WPF 中最基础的线性布局面板继承自Panel核心职责是按单一方向垂直或水平依次堆叠子元素。本文从官方类定义与继承结构出发系统梳理其核心特性、唯一关键属性Orientation、底层 Measure/Arrange 两步布局原理、XAML 与 C# 两种使用方式以及拉伸填充、溢出滚动等新手必看细节同时与 Grid、WrapPanel 等面板横向对比给出推荐与避免使用的场景清单最后通过登录表单和工具栏两个完整实战示例帮助读者从理论直达可运行代码。StackPanel是 WPF最简洁、最基础、最常用的线性布局面板继承自Panel基类是所有线性排列布局的首选控件。 它的核心逻辑只有一句话将子元素按照 垂直 / 水平 单一方向依次 “堆叠” 排列一个挨着一个不换行、不重叠。一、官方类定义与继承结构1. 核心类声明源码级csharppublicclassStackPanel:Panel公开类可直接实例化、可继承自定义非密封类支持扩展直接继承Panel拥有子元素管理、可视化树、布局系统全部能力无额外接口结构极简仅实现基础线性堆叠2. 完整继承链WPF 标准层级Object └─ DispatcherObjectUI线程绑定 └─ DependencyObject依赖属性系统 └─ Visual渲染/命中测试 └─ UIElement基础布局/事件 └─ FrameworkElement样式/绑定/生命周期 └─ Panel子元素容器/布局契约 └─ StackPanel线性堆叠布局3. 官方核心定位用于在单行或单列中排列子元素的基础布局容器是 WPF 布局系统的「基础砖块」。二、StackPanel 核心特性必背单向排列仅支持垂直默认或水平一个方向依次堆叠子元素按添加顺序一个紧接一个排列不会自动换行内容超出容器边界会直接截断无滚动无比例分配不像 Grid 支持*占比尺寸由子元素自身决定自适应尺寸垂直堆叠宽度 最宽子元素宽度高度 所有子元素高度之和水平堆叠高度 最高子元素高度宽度 所有子元素宽度之和结构极简无行列定义零复杂配置开箱即用三、核心属性全部掌握即可精通StackPanel 配置极少核心属性只有 1 个其余为通用布局属性1. 【唯一核心属性】Orientation排列方向属性值说明默认值Vertical垂直堆叠从上到下✅ 默认Horizontal水平堆叠从左到右-xaml !-- 垂直排列默认可省略 -- StackPanel OrientationVertical !-- 水平排列 -- StackPanel OrientationHorizontal2. 通用布局属性继承自 Panel/FrameworkElement属性作用Children子元素集合所有布局面板核心Background面板背景画刷Margin面板外边距Padding面板内边距子元素与边框间距HorizontalAlignment水平对齐左 / 中 / 右 / 拉伸VerticalAlignment垂直对齐上 / 中 / 下 / 拉伸四、底层布局原理Measure Arrange 所有 WPF 布局都遵循两步布局法StackPanel 的实现最简洁第一步测量阶段MeasureOverride遍历所有子元素让每个子元素计算自己的大小垂直模式总宽度 所有子元素中最大宽度总高度 所有子元素高度累加水平模式总高度 所有子元素中最大高度总宽度 所有子元素宽度累加向父容器报告自己需要的尺寸第二步排列阶段ArrangeOverride按子元素添加顺序依次定位垂直模式从上到下每个子元素的Y 坐标是上一个元素的底部位置水平模式从左到右每个子元素的X 坐标是上一个元素的右侧位置不处理溢出超出容器边界的内容会被裁剪五、标准使用方法XAML C#方式 1XAML 使用推荐主流开发① 默认垂直堆叠最常用表单、列表xaml:StackPanelMargin10BackgroundWhite!--从上到下依次排列--TextBlockText用户名/TextBoxHeight30Margin0 5/TextBlockText密码/PasswordBoxHeight30Margin0 5/ButtonContent登录Height35Background#0078D7//StackPanel② 水平堆叠导航栏、按钮组xaml:StackPanelOrientationHorizontalMargin10BackgroundLightGray!--从左到右依次排列--ButtonContent首页Margin2/ButtonContent产品Margin2/ButtonContent关于Margin2/ButtonContent我的Margin2//StackPanel方式 2C# 后台代码创建// 1. 创建实例StackPanelstackPanelnewStackPanel();// 2. 设置方向水平stackPanel.OrientationOrientation.Horizontal;// 3. 添加子元素stackPanel.Children.Add(newButton{Content按钮1});stackPanel.Children.Add(newButton{Content按钮2});// 4. 添加到窗口this.ContentstackPanel;六、关键使用细节新手必看1. 子元素拉伸填充 StackPanel默认不会让子元素填充剩余空间需要手动设置xaml !-- 垂直StackPanel中让控件宽度填满 -- TextBox HorizontalAlignmentStretch/ !-- 水平StackPanel中让控件高度填满 -- Button VerticalAlignmentStretch/2. 溢出处理内容超出容器 StackPanel不会自动换行 / 滚动超出部分直接隐藏解决方案xaml:!-- 包裹 ScrollViewer 实现滚动 -- ScrollViewer VerticalScrollBarVisibilityAuto StackPanel !-- 大量子元素 -- /StackPanel /ScrollViewer3. 间距控制元素之间间距使用子元素的Margin整体内边距使用 StackPanel 的Padding4. 常见问题与排查问题一子元素不显示或尺寸异常问题现象明明在 XAML 中添加了子控件但界面上看不到它们或者控件的宽度/高度显示为 0变得扁了或没了。原因分析错误地混用了垂直和水平堆叠方向下的尺寸逻辑。例如在垂直StackPanel中放入一个特宽图片却期望它按水平方向自适应或者忘记设置固定尺寸导致控件本身尺寸为零。解决方案垂直StackPanel中子元素宽度默认取最宽子元素宽度每个子元素的高度必须由自身决定如设置Height、MinHeight或内部内容撑开。水平StackPanel中子元素高度默认取最高子元素高度每个子元素的宽度必须由自身决定如设置Width、MinWidth或内部内容撑开。若子元素尺寸仍然异常检查该子元素自身是否显式设置了Width0或Height0或被父级容器的ClipToBounds裁剪。问题二内容超出容器后无法滚动问题现象在StackPanel中放置了较多子元素如 50 个按钮超出窗口或父容器边界的内容直接被截断看不到也没有出现滚动条。原因分析StackPanel本身不具备自动滚动能力它只是简单地把所有子元素按照方向排列下去超出部分默认被容器裁剪。解决方案在StackPanel外层包裹一个ScrollViewer并设置对应的滚动条可见性ScrollViewer VerticalScrollBarVisibilityAuto StackPanel !-- 大量子元素 -- /StackPanel /ScrollViewer若为水平超出则设置HorizontalScrollBarVisibilityAuto。问题三期望的拉伸填充未生效问题现象将子控件的HorizontalAlignment或VerticalAlignment设为Stretch但控件并没有填满StackPanel的可用空间仍然保持原始大小或仅靠一侧对齐。原因分析在垂直StackPanel中每个子元素的高度由自身内容决定VerticalAlignmentStretch对高度无效。在水平StackPanel中每个子元素的宽度由自身内容决定HorizontalAlignmentStretch对宽度无效。若将StackPanel嵌套在另一个StackPanel内部外层可能没有给内层足够的空间导致Stretch无法生效。解决方案垂直StackPanel想让子控件横向填满设置HorizontalAlignmentStretch纵向填满需改用Grid等支持比例分配的容器。水平StackPanel想让子控件纵向填满设置VerticalAlignmentStretch横向填满需改用Grid。确保StackPanel自身的Width/Height或父容器的空间足够否则Stretch也没有空间可以拉伸。七、StackPanel VS 其他布局面板核心区别 结合你学过的Grid/UniformGrid一眼区分使用场景控件排列方式复杂度适用场景StackPanel单向线性堆叠极低简单垂直 / 水平排列、表单、导航栏Grid二维网格行 列高复杂界面、表单对齐、响应式布局UniformGrid等大单元格网格低九宫格、计算器、等尺寸按钮WrapPanel线性自动换行低标签流、图片墙StackPanel 升级版八、适用场景 ✅ 禁用场景 ❌✅ 推荐使用简单垂直表单登录 / 注册水平导航栏、工具栏按钮组列表项内部布局结构极简无行列定义零复杂配置开箱即用作为复杂布局的子容器嵌套使用❌ 避免使用 / 不适用场景复杂二维界面用 Grid需要等比例分配空间用 Grid/UniformGrid需要自动换行用 WrapPanel高性能大数据列表用 ListBox/ListView九、官方自定义规范继承 StackPanel如果你需要扩展 StackPanel遵循微软官方规范直接继承StackPanel不继承Panel重写MeasureOverride/ArrangeOverride必须调用base.方法扩展属性用依赖属性不破坏原生线性堆叠逻辑csharp:// 官方规范自定义 StackPanel带间距publicclassCustomStackPanel:StackPanel{// 依赖属性注册 MeasureOverride/ArrangeOverride 重写}十、总结极简核心记忆类定义StackPanel : PanelWPF 最基础线性布局面板核心能力垂直 / 水平 单向依次堆叠不会自动换行、不重叠唯一核心属性Orientation控制排列方向布局规则垂直宽取最大高累加水平高取最大宽累加使用口诀简单线性用 Stack复杂网格用 Grid等大格子用 Uniform自动换行用 Wrap十一、实战演练示例 1垂直登录表单XAML 方式一个典型的登录界面使用垂直StackPanel完成用户名、密码输入框和登录按钮的布局。注意子控件的Margin、HorizontalAlignment等属性让界面更整齐。!-- 登录表单界面 -- StackPanel OrientationVertical Margin30 BackgroundWhite Width300 !-- 标题 -- TextBlock Text用户登录 FontSize20 FontWeightBold HorizontalAlignmentCenter Margin0 0 0 20/ !-- 用户名行 -- StackPanel OrientationHorizontal Margin0 0 0 10 TextBlock Text用户名 VerticalAlignmentCenter Width60/ TextBox x:NametxtUsername Width200 Height28 VerticalContentAlignmentCenter/ /StackPanel !-- 密码行 -- StackPanel OrientationHorizontal Margin0 0 0 20 TextBlock Text密 码 VerticalAlignmentCenter Width60/ PasswordBox x:NametxtPassword Width200 Height28 VerticalContentAlignmentCenter/ /StackPanel !-- 登录按钮 -- Button Content登录 Height35 Width100 Background#0078D7 ForegroundWhite FontWeightBold HorizontalAlignmentCenter ClickLoginButton_Click/ /StackPanel对应的后台事件处理在窗口代码后置文件中privatevoidLoginButton_Click(objectsender,RoutedEventArgse){stringusernametxtUsername.Text;stringpasswordtxtPassword.Password;if(!string.IsNullOrWhiteSpace(username)!string.IsNullOrWhiteSpace(password)){MessageBox.Show($欢迎{username},登录成功,MessageBoxButton.OK,MessageBoxImage.Information);}else{MessageBox.Show(请输入用户名和密码,提示,MessageBoxButton.OK,MessageBoxImage.Warning);}}示例 2带图标工具栏水平 垂直嵌套XAML 方式构建一个水平工具栏每个工具项内部使用垂直StackPanel将图标按钮和文本标签组合在一起。!-- 工具栏界面 -- StackPanel OrientationHorizontal Margin10 Background#F0F0F0 Height60 !-- 新建按钮组 -- StackPanel OrientationVertical Margin5 0 HorizontalAlignmentCenter Width60 Button Content FontSize16 Width40 Height40 HorizontalAlignmentCenter BackgroundTransparent BorderThickness0 ToolTip新建文档 ClickNewButton_Click/ TextBlock Text新建 HorizontalAlignmentCenter FontSize11/ /StackPanel !-- 打开按钮组 -- StackPanel OrientationVertical Margin5 0 HorizontalAlignmentCenter Width60 Button Content FontSize16 Width40 Height40 HorizontalAlignmentCenter BackgroundTransparent BorderThickness0 ToolTip打开文件 ClickOpenButton_Click/ TextBlock Text打开 HorizontalAlignmentCenter FontSize11/ /StackPanel !-- 保存按钮组 -- StackPanel OrientationVertical Margin5 0 HorizontalAlignmentCenter Width60 Button Content FontSize16 Width40 Height40 HorizontalAlignmentCenter BackgroundTransparent BorderThickness0 ToolTip保存文件 ClickSaveButton_Click/ TextBlock Text保存 HorizontalAlignmentCenter FontSize11/ /StackPanel /StackPanel对应的后台事件处理privatevoidNewButton_Click(objectsender,RoutedEventArgse){MessageBox.Show(新建文档功能。,提示);}privatevoidOpenButton_Click(objectsender,RoutedEventArgse){MessageBox.Show(打开文件功能。,提示);}privatevoidSaveButton_Click(objectsender,RoutedEventArgse){MessageBox.Show(保存文件功能。,提示);}示例 3C# 后台代码动态构建工具栏如果希望在代码中动态创建上述工具栏例如根据配置文件生成按钮可以这样做publicvoidBuildToolbar(){// 创建外层水平 StackPanelvartoolbarnewStackPanel{OrientationOrientation.Horizontal,MarginnewThickness(10),BackgroundnewSolidColorBrush(Color.FromRgb(240,240,240)),Height60};// 批量添加按钮AddToolItem(toolbar,,新建,(s,e)ShowMessage(新建文档功能。));AddToolItem(toolbar,,打开,(s,e)ShowMessage(打开文件功能。));AddToolItem(toolbar,,保存,(s,e)ShowMessage(保存文件功能。));// 将工具栏添加到窗口或容器例如 Grid 的某一行this.Contenttoolbar;}privatevoidAddToolItem(StackPanelparent,stringicon,stringlabel,RoutedEventHandlerclickHandler){// 每个工具项一个垂直 StackPanelvaritemnewStackPanel{OrientationOrientation.Vertical,MarginnewThickness(5,0,5,0),HorizontalAlignmentHorizontalAlignment.Center,Width60};varbuttonnewButton{Contenticon,FontSize16,Width40,Height40,HorizontalAlignmentHorizontalAlignment.Center,BackgroundBrushes.Transparent,BorderThicknessnewThickness(0),ToolTip${label}操作};button.ClickclickHandler;vartextnewTextBlock{Textlabel,HorizontalAlignmentHorizontalAlignment.Center,FontSize11};item.Children.Add(button);item.Children.Add(text);parent.Children.Add(item);}privatevoidShowMessage(stringmsg){MessageBox.Show(msg,提示);}以上两个实战示例覆盖了StackPanel的垂直、水平以及嵌套使用方式并分别给出了 XAML 声明式写法和 C# 后台代码写法可直接复制到 WPF 项目中运行。