ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

003011001_WPF布局实例

003011001_WPF布局实例 003011001_WPF 布局实例摘要本文面向 WPF 开发者系统梳理从入门到工业级的四大布局实战案例——设备登录界面Grid StackPanel、设备列表界面DockPanel 数据绑定、工业设备操作面板Canvas 动态交互以及生产监控主界面虚拟化 多区域布局。每个实例均包含 XAML 代码、后台 C# 代码及关键知识点解析并深入讲解 VirtualizingStackPanel 的 UI 虚拟化与容器回收原理帮助读者循序渐进掌握 WPF 布局核心技能与性能优化技巧。难度等级⭐ 入门级基础布局组合实例 1设备登录界面学习目标掌握Grid行列划分、StackPanel垂直/水平排列、Border装饰器的基础用法。功能包含用户名输入、密码输入、登录/取消按钮居中布局。XAMLWindow x:ClassWpfLayoutDemo.LoginWindow xmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:xhttp://schemas.microsoft.com/winfx/2006/xaml Title设备登录 Width400 Height300 WindowStartupLocationCenterScreen ResizeModeNoResize !-- 外层Border添加圆角和阴影 -- Border Background#F5F5F5 CornerRadius10 Margin10 !-- 3行1列Grid划分标题区、输入区、按钮区 -- Grid Margin20 Grid.RowDefinitions RowDefinition HeightAuto/ RowDefinition Height*/ RowDefinition HeightAuto/ /Grid.RowDefinitions !-- 1. 标题区 -- TextBlock Grid.Row0 Text工业设备管理系统 FontSize22 FontWeightBold HorizontalAlignmentCenter Margin0,0,0,20/ !-- 2. 输入区垂直StackPanel -- StackPanel Grid.Row1 !-- 用户名行水平StackPanel -- StackPanel OrientationHorizontal VerticalAlignmentCenter TextBlock Text用户名 Width60 FontSize14/ TextBox Width200 Height30 FontSize14/ /StackPanel !-- 密码行 -- StackPanel OrientationHorizontal VerticalAlignmentCenter TextBlock Text密 码 Width60 FontSize14/ PasswordBox Width200 Height30 FontSize14/ /StackPanel /StackPanel !-- 3. 按钮区水平StackPanel右对齐 -- StackPanel Grid.Row2 OrientationHorizontal HorizontalAlignmentRight Margin0,20,0,0 Button Content登录 Width80 Height35 Background#2196F3 ForegroundWhite/ Button Content取消 Width80 Height35/ /StackPanel /Grid /Border /Window关键知识点Grid.RowDefinitions定义行高Auto 自适应内容* 占满剩余空间StackPanel.Orientation控制排列方向垂直/水平Border为整个窗口添加圆角和背景提升视觉效果难度等级⭐⭐ 进阶级嵌套布局 数据绑定实例 2设备列表界面学习目标掌握DockPanel停靠布局、ListView数据绑定、DataTemplate自定义列表项、嵌套Grid布局。功能包含顶部标题栏、左侧设备分类、右侧设备列表列表项显示设备 ID、状态、运行时间。XAMLWindow x:ClassWpfLayoutDemo.DeviceListWindow xmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:xhttp://schemas.microsoft.com/winfx/2006/xaml Title设备列表 Width800 Height600 !-- DockPanel顶部停靠标题栏左侧停靠分类栏剩余空间给列表 -- DockPanel !-- 1. 顶部标题栏停靠顶部 -- Border DockPanel.DockTop Background#2196F3 Height50 TextBlock Text设备管理系统 FontSize18 ForegroundWhite HorizontalAlignmentCenter VerticalAlignmentCenter/ /Border !-- 2. 左侧分类栏停靠左侧 -- Border DockPanel.DockLeft Background#F0F0F0 Width150 Margin0,0,1,0 StackPanel Margin10 Button Content全部设备 Height35 Background#E3F2FD/ Button ContentCNC设备 Height35/ Button ContentAOI设备 Height35/ Button Content输送线 Height35/ /StackPanel /Border !-- 3. 右侧设备列表占满剩余空间 -- ListView x:NameDeviceListView Margin10 ListView.ItemTemplate DataTemplate !-- 列表项嵌套Grid布局 -- Border BorderBrush#E0E0E0 BorderThickness1 CornerRadius5 Padding10 Margin0,5 Grid Grid.ColumnDefinitions ColumnDefinition WidthAuto/ ColumnDefinition Width*/ ColumnDefinition WidthAuto/ /Grid.ColumnDefinitions !-- 状态指示灯 -- Ellipse Grid.Column0 Width15 Height15 Fill{Binding StatusColor} Margin0,0,10,0/ !-- 设备信息 -- StackPanel Grid.Column1 TextBlock Text{Binding DeviceId} FontSize14 FontWeightBold/ TextBlock Text{Binding DeviceName} FontSize12 ForegroundGray/ /StackPanel !-- 运行时间 -- TextBlock Grid.Column2 Text{Binding RunTime} FontSize12 VerticalAlignmentCenter/ /Grid /Border /DataTemplate /ListView.ItemTemplate /ListView /DockPanel /Window后台绑定代码C#public partial class DeviceListWindow : Window { public class DeviceInfo { public string DeviceId { get; set; } public string DeviceName { get; set; } public SolidColorBrush StatusColor { get; set; } public string RunTime { get; set; } } public DeviceListWindow() { InitializeComponent(); LoadDeviceData(); } private void LoadDeviceData() { var devices new ListDeviceInfo { new DeviceInfo { DeviceId CNC_001, DeviceName 数控车床1号, StatusColor Brushes.Green, RunTime 123小时 }, new DeviceInfo { DeviceId AOI_002, DeviceName 光学检测2号, StatusColor Brushes.Red, RunTime 89小时 }, new DeviceInfo { DeviceId CNC_003, DeviceName 数控车床3号, StatusColor Brushes.Yellow, RunTime 256小时 } }; DeviceListView.ItemsSource devices; } }关键知识点DockPanel.Dock控制子元素停靠位置Top/Left/Right/BottomDataTemplate自定义列表项的外观简单数据绑定将后台集合绑定到ListView.ItemsSource难度等级⭐⭐⭐ 高级Canvas 绝对布局 动态交互实例 3工业设备操作面板学习目标掌握Canvas绝对定位、ZIndex层级控制、动态修改控件属性、定时器实时更新。功能固定尺寸的设备操作面板包含状态指示灯、实时数据显示、操作按钮支持状态切换。XAMLWindow x:ClassT007003_WPFLayoutDemo.MainWindow xmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:xhttp://schemas.microsoft.com/winfx/2006/xaml xmlns:dhttp://schemas.microsoft.com/expression/blend/2008 xmlns:mchttp://schemas.openxmlformats.org/markup-compatibility/2006 xmlns:localclr-namespace:T007003_WPFLayoutDemo mc:Ignorabled Title设备操作面板 Width800 Height600 ResizeModeNoResize WindowStartupLocationCenterScreen Canvas Width800 Height600 Background#F0F0F0 !-- 1. 背景图底层ZIndex0 -- Rectangle Canvas.Left0 Canvas.Top0 Width800 Height600 Fill#ECEFF1 / !-- 2. 状态指示灯区 -- Border Canvas.Left50 Canvas.Top50 Width300 Height100 BackgroundWhite CornerRadius5 Padding15 StackPanel OrientationHorizontal StackPanel Ellipse x:NameRunStatusLight Width40 Height40 FillRed / TextBlock Text运行状态 HorizontalAlignmentCenter / /StackPanel StackPanel Ellipse x:NameAlarmStatusLight Width40 Height40 FillGray / TextBlock Text报警状态 HorizontalAlignmentCenter / /StackPanel /StackPanel /Border !-- 3. 实时数据区 -- Border Canvas.Left50 Canvas.Top180 Width300 Height200 BackgroundWhite CornerRadius5 Padding15 StackPanel TextBlock Text实时数据 FontSize16 FontWeightBold / StackPanel StackPanel OrientationHorizontal TextBlock Text当前温度 Width80 / TextBlock x:NameTxtTemperature Text25.5℃ ForegroundBlue / /StackPanel StackPanel OrientationHorizontal TextBlock Text当前转速 Width80 / TextBlock x:NameTxtSpeed Text1500 rpm ForegroundBlue / /StackPanel StackPanel OrientationHorizontal TextBlock Text产量 Width80 / TextBlock x:NameTxtOutput Text1234 件 ForegroundBlue / /StackPanel /StackPanel /StackPanel /Border !-- 4. 操作按钮区 -- Border Canvas.Left50 Canvas.Top410 Width700 Height120 BackgroundWhite CornerRadius5 Padding15 StackPanel OrientationHorizontal HorizontalAlignmentCenter Button x:NameBtnStart Content启动 Width120 Height50 BackgroundGreen ForegroundWhite FontSize16 ClickBtnStart_Click / Button x:NameBtnStop Content停止 Width120 Height50 BackgroundRed ForegroundWhite FontSize16 ClickBtnStop_Click / Button x:NameBtnReset Content复位 Width120 Height50 BackgroundGray ForegroundWhite FontSize16 ClickBtnReset_Click / Button x:NameBtnAlarm Content模拟报警 Width120 Height50 BackgroundOrange ForegroundWhite FontSize16 ClickBtnAlarm_Click / /StackPanel /Border /Canvas /Window后台交互代码C#public partial class DevicePanelWindow : Window { private DispatcherTimer _timer; private Random _random new Random(); public DevicePanelWindow() { InitializeComponent(); _timer new DispatcherTimer { Interval TimeSpan.FromSeconds(1) }; _timer.Tick Timer_Tick; _timer.Start(); } private void Timer_Tick(object sender, EventArgs e) { // 模拟实时数据更新 TxtTemperature.Text ${25 _random.NextDouble() * 10:F1}℃; TxtSpeed.Text ${1500 _random.Next(-100, 100)} rpm; } private void BtnStart_Click(object sender, RoutedEventArgs e) { RunStatusLight.Fill Brushes.Green; MessageBox.Show(设备已启动); } private void BtnStop_Click(object sender, RoutedEventArgs e) { RunStatusLight.Fill Brushes.Red; MessageBox.Show(设备已停止); } private void BtnReset_Click(object sender, RoutedEventArgs e) { RunStatusLight.Fill Brushes.Gray; AlarmStatusLight.Fill Brushes.Gray; TxtOutput.Text 0 件; MessageBox.Show(设备已复位); } private void BtnAlarm_Click(object sender, RoutedEventArgs e) { AlarmStatusLight.Fill Brushes.Red; MessageBox.Show(模拟报警触发); } }关键知识点Canvas.Left/Canvas.Top精确控制控件位置DispatcherTimer实现 UI 线程的定时更新动态修改控件的Fill、Text等属性实现状态切换难度等级⭐⭐⭐⭐ 工业级虚拟化 多区域 性能优化实例 4生产监控主界面学习目标掌握Grid复杂嵌套、VirtualizingStackPanel虚拟化、UniformGrid均匀布局、样式复用、多区域布局。功能完整的工业上位机主界面包含顶部导航栏、左侧菜单、主内容区4 个产能卡片 数据表格、底部状态栏。XAMLWindow x:ClassWpfLayoutDemo.MonitorWindow xmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:xhttp://schemas.microsoft.com/winfx/2006/xaml Title生产监控系统 Width1200 Height800 WindowStartupLocationCenterScreen !-- 整体3行1列Grid顶部导航、中间内容、底部状态栏 -- Grid Grid.RowDefinitions RowDefinition Height50/ RowDefinition Height*/ RowDefinition Height30/ /Grid.RowDefinitions !-- 1. 顶部导航栏 -- Border Grid.Row0 Background#1976D2 Grid Grid.ColumnDefinitions ColumnDefinition WidthAuto/ ColumnDefinition Width*/ ColumnDefinition WidthAuto/ /Grid.ColumnDefinitions TextBlock Grid.Column0 Text生产监控系统 FontSize18 ForegroundWhite VerticalAlignmentCenter Margin20,0/ TextBlock Grid.Column2 Text当前用户管理员 ForegroundWhite VerticalAlignmentCenter Margin0,0,20,0/ /Grid /Border !-- 2. 中间内容区2列Grid左侧菜单右侧主内容 -- Grid Grid.Row1 Grid.ColumnDefinitions ColumnDefinition Width180/ ColumnDefinition Width*/ /Grid.ColumnDefinitions !-- 左侧菜单 -- Border Grid.Column0 Background#F5F5F5 BorderThickness0,0,1,0 BorderBrush#E0E0E0 StackPanel Margin0,10 Spacing2 Button Content生产监控 Height40 Background#E3F2FD HorizontalContentAlignmentLeft Padding20,0/ Button Content设备管理 Height40 HorizontalContentAlignmentLeft Padding20,0/ Button Content产量统计 Height40 HorizontalContentAlignmentLeft Padding20,0/ Button Content系统设置 Height40 HorizontalContentAlignmentLeft Padding20,0/ /StackPanel /Border !-- 右侧主内容区2行1列Grid产能卡片数据表格 -- Grid Grid.Column1 Margin10 Grid.RowDefinitions RowDefinition HeightAuto/ RowDefinition Height*/ /Grid.RowDefinitions !-- 产能卡片区UniformGrid 2行2列均匀布局 -- UniformGrid Grid.Row0 Rows2 Columns2 Spacing10 Margin0,0,0,10 !-- 卡片1总产量 -- Border Background#E3F2FD CornerRadius5 Padding15 StackPanel TextBlock Text总产量 FontSize14 Foreground#1976D2/ TextBlock Text12345 FontSize32 FontWeightBold Margin0,10,0,0/ TextBlock Text较昨日 5% FontSize12 ForegroundGreen/ /StackPanel /Border !-- 卡片2良品数 -- Border Background#E8F5E9 CornerRadius5 Padding15 StackPanel TextBlock Text良品数 FontSize14 Foreground#388E3C/ TextBlock Text12000 FontSize32 FontWeightBold Margin0,10,0,0/ TextBlock Text良率 97.2% FontSize12 ForegroundGreen/ /StackPanel /Border !-- 卡片3不良数 -- Border Background#FFEBEE CornerRadius5 Padding15 StackPanel TextBlock Text不良数 FontSize14 Foreground#D32F2F/ TextBlock Text345 FontSize32 FontWeightBold Margin0,10,0,0/ TextBlock Text不良率 2.8% FontSize12 ForegroundRed/ /StackPanel /Border !-- 卡片4运行时间 -- Border Background#FFF8E1 CornerRadius5 Padding15 StackPanel TextBlock Text运行时间 FontSize14 Foreground#F57C00/ TextBlock Text89.5h FontSize32 FontWeightBold Margin0,10,0,0/ TextBlock Text稼动率 92% FontSize12 ForegroundGreen/ /StackPanel /Border /UniformGrid !-- 数据表格区开启虚拟化的DataGrid -- DataGrid Grid.Row1 AutoGenerateColumnsFalse VirtualizingStackPanel.IsVirtualizingTrue VirtualizingStackPanel.VirtualizationModeRecycling ScrollViewer.CanContentScrollTrue RowHeight30 DataGrid.Columns DataGridTextColumn Header序号 Binding{Binding Index} Width60/ DataGridTextColumn Header产品编号 Binding{Binding ProductNo} Width120/ DataGridTextColumn Header生产时间 Binding{Binding ProduceTime} Width150/ DataGridTextColumn Header状态 Binding{Binding Status} Width80/ DataGridTextColumn Header操作员 Binding{Binding Operator} Width100/ /DataGrid.Columns /DataGrid /Grid /Grid !-- 3. 底部状态栏 -- Border Grid.Row2 Background#F5F5F5 BorderThickness0,1,0,0 BorderBrush#E0E0E0 Grid Grid.ColumnDefinitions ColumnDefinition Width*/ ColumnDefinition WidthAuto/ /Grid.ColumnDefinitions TextBlock Grid.Column0 Text系统运行正常 VerticalAlignmentCenter Margin10,0/ TextBlock Grid.Column1 Text{Binding Source{x:Static sys:DateTime.Now}, StringFormatyyyy-MM-dd HH:mm:ss} VerticalAlignmentCenter Margin0,0,10,0/ /Grid /Border /Grid /Window关键知识点UniformGrid实现均匀分布的卡片布局VirtualizingStackPanel开启虚拟化支持 10 万 行数据流畅滚动多层Grid嵌套实现复杂的多区域布局样式复用和性能优化技巧VirtualizingStackPanel 虚拟化原理详解UI 虚拟化UI Virtualization是 WPF 提供的一种性能优化机制核心思想是按需创建即时回收。当ItemsControl如DataGrid、ListBox包含大量数据项时如果一次性为所有数据项创建对应的可视化元素如DataGridRow将消耗大量内存和 CPU 资源导致界面卡顿甚至崩溃。虚拟化技术仅创建当前可视区域内的少量元素当用户滚动时离开可视区域的元素会被回收并重新填充新进入可视区域的数据从而大幅降低内存占用和 UI 线程压力。容器回收Container Recycling是VirtualizationModeRecycling的进一步优化。默认的VirtualizationModeStandard在回收容器时会丢弃旧容器并重新创建新容器而Recycling模式会复用已有的容器对象仅刷新其DataContext避免了频繁创建/销毁对象的开销是工业级大数据表格的首选配置。C# 示例为 DataGrid 绑定 10,000 条数据publicpartialclassMonitorWindow:Window{publicMonitorWindow(){InitializeComponent();LoadLargeData();}privatevoidLoadLargeData(){// 生成 10000 条模拟生产数据vardatanewListProductRecord();varrandomnewRandom();varstatusesnew[]{合格,不合格,待检测};varoperatorsnew[]{张三,李四,王五,赵六};for(inti1;i10000;i){data.Add(newProductRecord{Indexi,ProductNo$P{DateTime.Now:yyyyMMdd}-{i:D4},ProduceTimeDateTime.Now.AddMinutes(-random.Next(0,1440)).ToString(yyyy-MM-dd HH:mm:ss),Statusstatuses[random.Next(statuses.Length)],Operatoroperators[random.Next(operators.Length)]});}// 绑定到 DataGrid需在 XAML 中给 DataGrid 设置 x:NameProductDataGridProductDataGrid.ItemsSourcedata;}}publicclassProductRecord{publicintIndex{get;set;}publicstringProductNo{get;set;}publicstringProduceTime{get;set;}publicstringStatus{get;set;}publicstringOperator{get;set;}}配合 XAML 中DataGrid的虚拟化设置VirtualizingStackPanel.IsVirtualizingTrue和VirtualizationModeRecycling即使绑定 10,000 条数据滚动依然流畅内存占用仅维持在可视区域的几十行左右。学习路径建议先完成入门级实例掌握Grid、StackPanel、Border的基础用法再做进阶级实例学习数据绑定和自定义列表项然后挑战高级实例练习 Canvas 绝对布局和动态交互最后研究工业级实例掌握复杂界面的组织和性能优化
返回列表