WPF Grid布局实战:5分钟搞定复杂表单设计(附完整代码)

【WPF应用7】 基本控件-Grid 布局的详解与示例 WPF 基本控件-Grid布局的详解与示例 阅读详情

WPF Grid布局实战:5分钟搞定复杂表单设计(附完整代码)

在企业级应用开发中,表单设计是最常见也最考验开发者布局功底的场景之一。传统的表单布局往往面临标签对齐困难、控件间距不一致、响应式适配差等问题。本文将带你深入WPF Grid布局的核心技巧,通过实战案例演示如何快速构建专业级数据录入界面。

1. Grid布局基础速成

Grid作为WPF最强大的布局容器,其核心在于行列系统的精确定义。我们先通过一个简单的用户登录表单,快速掌握三大核心属性:

<Grid>
    <!-- 定义2列:标签列固定宽度,输入列自适应 -->
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>  <!-- 自动适应标签文本 -->
        <ColumnDefinition Width="*"/>     <!-- 占满剩余空间 -->
    </Grid.ColumnDefinitions>
    
    <!-- 定义3行:每行高度根据内容自动调整 -->
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>

    <!-- 用户名输入行 -->
    <TextBlock Text="用户名:" VerticalAlignment="Center" Margin="5"/>
    <TextBox Grid.Column="1" Margin="5" Height="25"/>

    <!-- 密码输入行 -->
    <TextBlock Text="密码:" Grid.Row="1" VerticalAlignment="Center" Margin="5"/>
    <PasswordBox Grid.Row="1" Grid.Column="1" Margin="5" Height="25"/>

    <!-- 按钮行 -->
    <StackPanel Grid.Row="2" Grid.ColumnSpan="2" Orientation="Horizontal" HorizontalAlignment="Right">
        <Button Content="登录" Width="80" Margin="5"/>
        <Button Content="取消" Width="80" Margin="5"/>
    </StackPanel>
</Grid>

关键技巧解析:

  • Auto尺寸:标签列自动适应最长文本内容
  • *比例:输入框自动填充剩余空间
  • Grid.Row/Column:精确定位元素到指定单元格
  • Grid.ColumnSpan:实现跨列布局(如底部的按钮组)

2. 企业级表单设计实战

下面我们构建一个完整的员工信息录入表单,包含基本信息、教育经历和工作经历三个区块:

<Grid Margin="10">
    <!-- 定义主布局:左侧标签30%,右侧输入70% -->
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="0.3*"/>
        <ColumnDefinition Width="0.7*"/>
    </Grid.ColumnDefinitions>
    
    <!-- 定义10行:标题行固定高度,其余自适应 -->
    <Grid.RowDefinitions>
        <RowDefinition Height="40"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="30"/>  <!-- 分隔标题 -->
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="30"/>  <!-- 分隔标题 -->
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>

    <!-- 基本信息区块 -->
    <TextBlock Text="基本信息" FontWeight="Bold" Grid.ColumnSpan="2"
               VerticalAlignment="Center"/>
    
    <TextBlock Text="姓名:" Grid.Row="1" VerticalAlignment="Center"/>
    <TextBox Grid.Row="1" Grid.Column="1" Margin="0,5" Height="25"/>

    <TextBlock Text="性别:" Grid.Row="2" VerticalAlignment="Center"/>
    <StackPanel Grid.Row="2" Grid.Column="1" Orientation="Horizontal" Margin="0,5">
        <RadioButton Content="男" GroupName="Gender" Margin="0,0,20,0"/>
        <RadioButton Content="女" GroupName="Gender"/>
    </StackPanel>

    <!-- 教育经历区块 -->
    <Border Grid.Row="5" Grid.ColumnSpan="2" Background="#EEE" Height="1"/>
    <TextBlock Text="教育经历" FontWeight="Bold" Grid.Row="5" Grid.ColumnSpan="2"
               VerticalAlignment="Center" Margin="0,0,0,5"/>

    <!-- 动态添加教育经历行 -->
    <ItemsControl Grid.Row="6" Grid.ColumnSpan="2" ItemsSource="{Binding Educations}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid Margin="0,5">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="0.3*"/>
                        <ColumnDefinition Width="0.3*"/>
                        <ColumnDefinition Width="0.4*"/>
                    </Grid.ColumnDefinitions>
                    <TextBox Text="{Binding School}" Margin="0,0,5,0"/>
                    <ComboBox Grid.Column="1" ItemsSource="{StaticResource Degrees}"
                              SelectedItem="{Binding Degree}" Margin="0,0,5,0"/>
                    <DatePicker Grid.Column="2" SelectedDate="{Binding GraduationDate}"/>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

    <!-- 底部操作按钮 -->
    <StackPanel Grid.Row="10" Grid.ColumnSpan="2" Orientation="Horizontal" 
                HorizontalAlignment="Right" Margin="0,10">
        <Button Content="保存" Width="100" Height="30" Command="{Binding SaveCommand}"/>
        <Button Content="重置" Width="100" Height="30" Margin="10,0,0,0"
                Command="{Binding ResetCommand}"/>
    </StackPanel>
</Grid>

高级技巧说明:

  1. 比例尺寸:使用0.3*和0.7*实现精确的30%-70%分栏
  2. 动态内容:通过ItemsControl绑定集合实现可动态增减的表单行
  3. 视觉分层:使用Border控件创建分隔线增强表单可读性
  4. 复合控件:在单元格内嵌套StackPanel实现水平排列的单选按钮组

3. 响应式布局进阶技巧

当表单需要适应不同窗口大小时,我们需要更智能的布局策略。以下是三种实战验证的有效方案:

3.1 最小宽度约束

<ColumnDefinition Width="2*" MinWidth="150"/>

适用场景:防止比例列在窗口缩小时变得过窄,确保内容可读性

3.2 断点布局切换

// 在窗口SizeChanged事件中动态调整布局
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
    if (e.NewSize.Width < 800)
    {
        // 小屏布局:改为垂直堆叠
        mainGrid.ColumnDefinitions[0].Width = new GridLength(1, GridUnitType.Star);
        mainGrid.ColumnDefinitions[1].Width = new GridLength(0);
        Grid.SetRow(detailPanel, 1);
        Grid.SetColumn(detailPanel, 0);
    }
    else
    {
        // 大屏布局:恢复左右分栏
        mainGrid.ColumnDefinitions[0].Width = new GridLength(300);
        mainGrid.ColumnDefinitions[1].Width = new GridLength(1, GridUnitType.Star);
        Grid.SetRow(detailPanel, 0);
        Grid.SetColumn(detailPanel, 1);
    }
}

3.3 共享尺寸组

当表单需要多列对齐时(如标签列),使用SharedSizeGroup保持同步:

<Grid Grid.IsSharedSizeScope="True">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" SharedSizeGroup="LabelColumn"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    
    <!-- 其他嵌套Grid也使用相同的SharedSizeGroup -->
</Grid>

4. 完整企业表单模板

以下是一个可直接复用的XAML模板,包含表单验证、动态行和响应式设计:

<Window x:Class="EnterpriseApp.Views.EmployeeFormView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="员工信息录入" Height="600" Width="900"
        MinWidth="600" MinHeight="400">
    
    <Grid Margin="10" x:Name="MainGrid">
        <Grid.Resources>
            <!-- 验证错误模板 -->
            <ControlTemplate x:Key="ErrorTemplate">
                <StackPanel>
                    <AdornedElementPlaceholder/>
                    <TextBlock Text="{Binding [0].ErrorContent}" Foreground="Red" Margin="5,0"/>
                </StackPanel>
            </ControlTemplate>
            
            <!-- 必填字段样式 -->
            <Style TargetType="TextBlock" x:Key="RequiredLabel">
                <Setter Property="Foreground" Value="#333"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding (Validation.HasError), 
                        RelativeSource={RelativeSource AncestorType=ContentPresenter}}"
                        Value="True">
                        <Setter Property="Foreground" Value="Red"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Grid.Resources>

        <!-- 主布局:左侧30% + 右侧70% -->
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="0.3*" MinWidth="180"/>
            <ColumnDefinition Width="0.7*"/>
        </Grid.ColumnDefinitions>

        <!-- 动态行高布局 -->
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>

        <!-- 基本信息区块 -->
        <GroupBox Header="基本信息" Grid.ColumnSpan="2" Margin="0,0,0,10">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" SharedSizeGroup="FormLabel"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>

                <TextBlock Text="员工姓名:" Grid.Row="0" Style="{StaticResource RequiredLabel}"/>
                <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Name, ValidatesOnDataErrors=True}"
                         Validation.ErrorTemplate="{StaticResource ErrorTemplate}" Margin="5"/>

                <!-- 更多字段... -->
            </Grid>
        </GroupBox>

        <!-- 动态表格区块 -->
        <TabControl Grid.Row="3" Grid.ColumnSpan="2" Margin="0,10">
            <TabItem Header="工作经历">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="Auto"/>
                    </Grid.RowDefinitions>

                    <DataGrid Grid.Row="1" ItemsSource="{Binding WorkExperiences}"
                              AutoGenerateColumns="False" CanUserAddRows="False">
                        <DataGrid.Columns>
                            <DataGridTextColumn Header="公司" Binding="{Binding Company}" Width="2*"/>
                            <DataGridTextColumn Header="职位" Binding="{Binding Position}" Width="*"/>
                            <!-- 更多列... -->
                        </DataGrid.Columns>
                    </DataGrid>

                    <StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Right">
                        <Button Content="添加" Command="{Binding AddExperienceCommand}" Margin="5"/>
                        <Button Content="删除" Command="{Binding RemoveExperienceCommand}" Margin="5"/>
                    </StackPanel>
                </Grid>
            </TabItem>
        </TabControl>

        <!-- 操作按钮 -->
        <StackPanel Grid.Row="4" Grid.ColumnSpan="2" Orientation="Horizontal" 
                    HorizontalAlignment="Right" Margin="0,10">
            <Button Content="保存" Width="120" Height="32" Command="{Binding SaveCommand}"/>
            <Button Content="取消" Width="120" Height="32" Margin="10,0,0,0" 
                    Command="{Binding CancelCommand}"/>
        </StackPanel>
    </Grid>
</Window>

模板亮点:

  1. 验证集成:内置数据验证提示和必填字段标记
  2. 动态表格:使用DataGrid实现可编辑的子表
  3. 分组布局:通过GroupBox和TabControl组织复杂内容
  4. 样式复用:定义共享资源确保整体风格一致

5. 性能优化与常见问题

性能优化建议:

  • 对静态表单设置CacheMode="BitmapCache"
  • 避免在Grid中嵌套过多层级(建议不超过3层)
  • 使用VirtualizingStackPanel处理大数据量滚动

典型问题解决方案:

问题现象可能原因解决方案
内容显示不全行高设置为Auto但内容动态加载设置MinHeight或使用*比例高度
布局错乱未正确设置Grid.Row/Column使用ShowGridLines="True"调试
响应迟钝频繁动态修改行列定义改用Visibility控制显隐而非修改结构

通过本文的实战技巧,开发者可以快速构建出专业、美观且高效的企业级表单界面。Grid布局的强大之处在于其精确的二维控制能力,结合WPF的数据绑定和样式系统,能够显著提升表单类界面的开发效率和质量。

WPF的布局核心:网格布局(Grid) 本文详细介绍了WPF中的Grid网格布局系统,主要包括以下核心内容:1)三种行列尺寸定义方式(Auto/*/固定值)及其应用场景;2)元素定位与跨行跨列合并的实现;3)高级技巧如共享尺寸组和动态布局;4)通过邮件客户端案例展示嵌套布局实践。文章还提供了常见问题排查指南,帮助开发者掌握这个最强大的二维布局控件,以构建复杂的界面结构。建议通过表格布局、响应式设计等场景进行实践练习。 阅读详情

相关推荐

C# WPF入门学习主线篇(十六)—— Grid布局容器

在《C# WPF入门学习主线篇(十六)—— Grid布局容器》这篇文章中,我们详细介绍了WPF中的 `Grid` 布局容器。本文涵盖了 `Grid` 的基本概念、常见属性及使用方法,并通过具体的示例代码展示了如何实现复杂且灵活的用户界面布局。此外,还讨论了 `Grid` 布局容器的优缺点,帮助读者在实际开发中做出更好的布局选择。

weixin_56595425的博客 3196

WPF编程基础入门 ——— 第三章 布局(七)布局面板Grid

WPF布局——布局面板GridWPF——Grid布局控件Grid简单实例——按钮排列Grid简单实例——登录界面 WPF——Grid布局控件 尽管上一篇讲解的UniformGrid能够布局统一单元格,但是很多布局中需要构建单元格大小不等,具有跨越式单元格(Span Cells) 和空白列等功能。而Grid能实现上述这些功能,它是一个使用灵活、能构建复杂UI的布局控件。 Grid最简单的用法是通过设置RowDefinitions和ColumnDefinitions属性定义单元格的总数。其中,RowDefini

m0_46334316的博客 8719

WPF GridSplitter控件实战:5分钟搞定可拖拽布局(附完整代码示例)

本文详细介绍了WPF中GridSplitter控件的实战应用,帮助开发者在5分钟内实现可拖拽的灵活布局。通过基础配置、进阶技巧和视觉定制等内容,结合完整代码示例,展示了如何利用GridSplitter提升WPF应用的用户体验。特别适合需要动态调整界面布局的开发者参考。

weixin_30399821的博客 467

WPF布局控件之Grid

WPF布局控件之Grid

就这样吧 2169

WPF实战:5分钟搞定一个炫酷登录界面(附完整XAML代码)

本文提供了一份详细的WPF登录界面开发实战指南。通过清晰的步骤讲解和完整的XAML代码示例,指导开发者快速构建一个兼具现代美感与流畅交互的登录窗口,涵盖布局设计、控件样式美化、动画效果添加及核心功能实现,助力提升WPF桌面应用的用户体验。

q1w3e5r7t9y的博客 293

C# WPF实战:5分钟搞定一个炫酷登录界面(附完整XAML代码)

本文提供了一份完整的C# WPF登录界面开发实战指南。通过清晰的步骤,详细讲解了如何使用XAML构建现代二分屏布局,实现MVVM模式下的数据绑定与命令处理,并解决PasswordBox绑定等常见问题。文章附带了完整的样式代码,帮助开发者快速创建美观、可复用的WPF界面。

weixin_29230773的博客 198

WPF Grid布局实战:5分钟搞定复杂表单设计(附跨行列技巧)

本文详细介绍了WPF Grid布局在复杂表单设计中的实战应用,通过电商订单管理系统案例,演示如何利用网格布局的行列定义、跨行列技巧和动态字段处理,快速构建专业级表单界面。重点讲解了Grid布局的基础用法、控件精准定位、跨行列高级技巧以及响应式优化方案,帮助开发者提升WPF界面开发效率。

beta5的博客 140

WPF新手必看:UniformGrid布局实战,5分钟搞定卡片式UI设计

本文详细介绍了WPF中UniformGrid布局的实战应用,帮助新手快速掌握卡片式UI设计。通过对比传统Grid,突出UniformGrid自动均分空间、动态调整行列等核心优势,并提供了电商商品展示墙的5分钟搭建教程,涵盖基础结构、动态响应、高级布局控制和样式美化等关键技巧。

weixin_29231725的博客 146

WPF StackPanel实战:5分钟搞定一个漂亮的设置页面布局

本文通过实战案例,详细讲解了如何利用WPF的StackPanel控件,在5分钟内快速构建一个清晰美观的设置页面布局。文章从理解StackPanel的线性布局原理入手,逐步演示了基础搭建、间距与对齐优化、嵌套布局等核心技巧,帮助开发者高效掌握这一布局控件的应用,提升WPF界面开发效率。

xk7n92h3p5m的博客 664

WPF项目救星:5分钟搞定ECharts动态图表,用WebView2实现C#与JS的实时数据推送(避坑指南)

本文详细介绍了如何在WPF项目中快速集成ECharts动态图表,利用WebView2实现C#与JavaScript的实时数据推送。通过5分钟快速部署指南和避坑技巧,帮助开发者解决传统图表控件的性能问题,提升数据可视化效率。特别适合需要高效数据交互的WPF应用场景。

437

.NET低代码框架:MAUI+Blazor Hybrid+Roslyn可视化开发实践

低代码开发是一种通过图形化界面快速构建应用的现代软件工程范式,其核心在于平衡开发效率与系统可控性。在.NET技术生态中,传统方案常面临跨端不一致、生成代码不可维护、业务规则难调试等痛点。本文基于真实生产项目,详解如何利用MAUI作为原生容器、Blazor Hybrid承担统一UI渲染、Roslyn脚本引擎实现动态规则执行,构建一套组件化、可审计、可版本控制的可视化开发框架。该方案支持声明式UI描述、运行时热重载与跨端一致性渲染,特别适用于金融、能源、政务等对代码主权和等保合规有严苛要求的行业场景。

clugcpne10995的博客 374

WPF Canvas控件实战:5分钟搞定游戏界面布局(附完整代码)

本文详细介绍了WPF Canvas控件在游戏界面布局中的实战应用,通过5分钟快速教程帮助开发者掌握绝对定位、动态元素控制和层级管理等核心技巧。文章包含完整代码示例,特别适合需要精确控制游戏元素位置的开发者,提升WPF游戏开发效率。

weixin_30275415的博客 248

C#性能真相:JIT、GC与抽象税的三重绞杀

托管语言的核心矛盾在于运行时抽象与系统性能的天然张力。C#作为典型现代托管语言,其JIT编译机制带来动态优化能力的同时,也引入不可忽视的启动延迟与CPU预热开销;垃圾回收器虽简化内存管理,却以Stop-The-World暂停和代际晋升不确定性为代价;而LINQ、async/await、字符串插值等高级语法糖,在提升开发效率的同时,实则层层叠加运行时开销——即所谓‘抽象税’。这些机制共同构成.NET应用在客户端响应、服务端延迟、基础设施确定性等关键场景下的性能瓶颈根源。本文聚焦C#真实世界性能表现,结合WPF

488

WPF ScrollViewer滚动条不显示?5分钟搞定父控件与子控件的高度设置

本文针对WPF开发中ScrollViewer滚动条不显示的常见问题,深入剖析了其根本原因在于父控件、ScrollViewer及子控件三者间的高度约束关系。文章提供了快速诊断流程,并重点推荐通过约束父容器高度、设置ScrollViewer的MaxHeight或使用DockPanel/Grid进行占位等核心解决方案,帮助开发者快速定位并解决滚动条显示异常,提升WPF界面开发效率。

hill8的博客 467

【SOFA】SOFA框架+Win10+VS2019 配置

SOFA (Simulation Open Framework Architecture)官网 SOFA 是一个开源的仿真框架,用于实时的物理仿真,而且主要针对医学上的仿真。主要用于研究人员开发新的算法,也可以作为一个有效的快速成型工具或是物理引擎。 官网中给出的配置方法写的很清晰,有着各个库或者软件的版本要求,仔细看按版本要求来 官网配置地址 官网给了两种方 1.通过脚本自动配置 2. 自己下载相关库通过CMake进行生成 第一种 没使用,不知道是否好使,因为如果其中有下载的东西,国内不一定能成功,大家可

GordonWei 5249

Ubuntu22.04安装ROS1

代表使用 2 线程进行编译,可以根据 CPU 适当调整。如果出现小乌龟窗口,说明安装成功 🎉!启动成功,则打开另一个终端,测试。需要解决一些兼容性问题,因为。由于 Ubuntu 22.04。过程,确保成功安装。

asafriend的博客 4639

3个痛点,1个工具搞定:Template Studio深度解析

作为Windows应用开发者,你是否经历过这样的场景:每次开始新项目都要重复搭建基础架构,花数小时配置导航框架、页面模板和依赖注入,结果代码结构还不符合最佳实践?或者面对WinUI 3、WPF、UWP三大技术栈时,不知如何选择适合的架构模式?Template Studio正是为解决这些痛点而生的微软官方解决方案,通过向导式体验加速WinUI 3、WPF和UWP应用开发,让开发者专注于业务逻辑而非重

gitblog_01095的博客 636

OpenFeign, Zuul, Gateway相互不兼容的问题总结

版本 Lib Vresion spring-cloud-starter-gateway 3.1.0 spring-cloud-dependencies 2021.0.0 spring-cloud-starter-netflix-zuul 2.2.6.RELEASE spring-cloud-starter-openfeign 3.1.0 1. Zuul 与OpenFeign 一起使用的问题 错误信息 jav.

Harry的博客 4124

Expression Blend实战开发技巧 第五章 从最常用ButtonStyle开始 - ImageButton

本文来自 烤地瓜 的博客,原文地址:http://www.cnblogs.com/kaodigua/archive/2011/02/16/1955688.html 【全面解禁!真正的Expression Blend实战开发技巧】第五章 从最常用ButtonStyle开始 - ImageButton   本章围绕ImageButton深入讨论,为什么是ImageBu...

weixin_33774883的博客 142

基于Simulink的占空比调制DTC降低转矩脉动

修改传统SVPWM模块,输入占空比d和有效矢量索引,计算Ton​=d∗Tc​、Toff​=(1−d)∗Tc​,生成对称PWM波形(替代开关表直接输出)。:低速时(n<500rpm)减小dmax​=0.6(避免磁链畸变),高速时(n>2000rpm)增大dmax​=0.8(提升动态响应);kT​/kψ​:转矩/磁链误差增益(需整定,如kT​=0.02/(N⋅m),kψ​=0.1/Wb);(θ为电压矢量与磁链夹角)。② SVM-DTC(占空比计算模块启用,d0​=0.5,kT​=0.02,kψ​=0.1)。

amy_mhd的博客 82

基于Python的彩票数据爬虫:数据抓取与趋势分析

爬虫是一种用于从互联网上自动抓取信息的程序。在抓取彩票数据时,我们首先需要确定目标网站并获取其网页内容,接着提取彩票的开奖结果信息并保存。彩票数据通常是以HTML表格或列表的形式展示,爬虫可以利用Python的requests和来抓取静态网页,或使用Selenium来抓取动态页面。在本篇博客中,我们深入探讨了如何使用Python编写彩票数据爬虫,抓取并分析彩票开奖结果。通过Python爬虫技术,结合数据分析与可视化工具,我们能够全面分析历史开奖数据,揭示彩票号码的频率分布、趋势变化以及未来的可能走势。

2201_76125261的博客 1934

WPF篇(1)-Grid控件(网格布局)

Grid控件绝对是WPF中所有布局控件中最好用的一个,因为它自适应屏幕的宽度,最关键的一点是,它在呈现时,其ActualWidth实际宽度和ActualHeight实际高度会有一个计算值,我们在业务开发中,有时候要根据父控件的实际宽度和高度来计算子控件的呈现位置和大小。

一个人的江湖 1898

基于STM32设计的指纹考勤机_348

随着信息化管理需求的日益增长,传统的人工考勤方式已难以满足现代社会对高效、精准和安全的考勤管理要求。为解决这一问题,本项目设计并实现了一款基于STM32的指纹考勤机系统。该系统采用AS608指纹识别模块进行人员身份识别,ESP8266无线模块实现与上位机APP的通信,支持人员信息录入、考勤时间段设置、考勤记录保存与查询等功能。系统通过SQLite数据库存储考勤数据,并提供导出EXCEL表格功能,方便数据管理与统计分析。该系统具有高效的考勤管理能力和良好的用户交互体验,能够广泛应用于企业、学校等机构的考勤管理

521
上一篇: Windows开发者必看:用API实现文件操作的3种高效方法(DeleteFile/CopyFile/MoveFile)
下一篇: 大疆智图集群建模实战:如何用5台电脑搭建高效空三处理流水线
git9versioner
博客等级 码龄3年 74粉丝 1650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值