WPF的发展历程
文章目录
- WPF的发展历程
- 引言
- 起源与背景(2001-2006)
- 从Avalon到WPF
- 设计目标与创新理念
- WPF核心技术特点与架构
- 基础架构与渲染模型
- 关键技术特点
- MVVM架构模式
- WPF在现代Windows开发中的地位与前景
- 当前市场定位
- 与其他微软UI技术的关系
- 未来发展前景
- 社区贡献与开源发展
- 教育和学习资源
- 总结与展望
- WPF的持久价值
- 未来发展方向
- 技术选择建议
- 参考文献
WPF的发展历程
引言
Windows Presentation Foundation(简称WPF)是微软公司推出的一种基于.NET Framework的用户界面框架,代表了Windows桌面应用程序开发的重大革新。作为微软桌面应用开发技术家族的核心成员,WPF的诞生和发展体现了微软对现代化用户界面和应用程序开发体验的不断追求。本文将全面回顾WPF从最初概念到如今发展的完整历程,分析其技术特点和架构演变,并探讨其在现代应用开发中的定位和未来走向。
起源与背景(2001-2006)
从Avalon到WPF
WPF的起源可以追溯到2001年,当时微软正在规划下一代Windows操作系统(后来成为Windows Vista)的核心技术。在代号为"Longhorn"的项目中,一个名为"Avalon"的图形子系统成为了WPF的前身。
Avalon项目的目标是创建一个全新的图形系统,旨在解决Windows传统图形技术GDI/GDI+和DirectX之间的分离问题,并提供更丰富的表现力和更高效的开发模式。该项目由微软的资深架构师们领导,包括当时负责用户体验的副总裁Joe Belfiore等人。
2003年10月,微软在PDC(专业开发者大会)上首次公开展示了Avalon技术,展示了其强大的图形能力和创新的编程模型。随着Longhorn项目的调整和重组,Avalon逐渐演变为一个独立的UI框架。2006年6月,微软正式将其命名为Windows Presentation Foundation(WPF),并作为.NET Framework 3.0的核心组件之一。
设计目标与创新理念
WPF的设计初衷是解决以下关键问题:
-
统一文档和应用界面:传统Windows应用和文档处理(如PDF查看)使用不同的渲染技术。WPF旨在提供统一的可视化系统。
-
利用现代图形硬件:充分发挥GPU的图形处理能力,提供硬件加速的图形渲染。
-
分离设计与开发:创建一个允许设计师和开发者高效协作的框架。
-
支持丰富媒体:将2D、3D、视频和音频集成到单一的架构中。
-
声明式编程模型:简化UI定义和开发流程。
WPF最具革命性的创新是引入了XAML(可扩展应用程序标记语言),这是一种基于XML的声明式语言,用于定义用户界面。XAML的引入使得界面设计和业务逻辑可以有效分离,设计师可以使用设计工具(如Expression Blend)创建界面,而开发者则专注于业务逻辑的实现。
WPF核心技术特点与架构
基础架构与渲染模型
WPF的核心架构是分层设计的,这种设计使其能够提供丰富的视觉效果和高性能的用户界面:
-
托管层:包括WPF框架API、控件库、布局引擎等,由.NET管理代码实现。
-
组合引擎:由非托管代码实现的milcore.dll,负责将视觉元素组合成最终的图像。
-
DirectX层:底层渲染基于DirectX,而不是传统的GDI/GDI+,实现了硬件加速。
与Windows Forms等早期技术相比,WPF的渲染模型有根本性的不同:
- 矢量图形优先:所有UI元素本质上都是矢量绘制,保证在不同分辨率和缩放级别下的清晰显示。
- 组合渲染:基于场景图(Scene Graph)的渲染模型,UI元素组织为视觉树。
- 硬件加速:充分利用GPU能力,特别是对2D、3D图形和动画的处理。
- 保留模式图形:WPF维护UI的内部表示,只需描述"什么"而不是"如何"渲染。
关键技术特点
WPF的核心技术特点使其在Windows UI框架中占据独特位置:
-
XAML:基于XML的声明式UI语言,实现了界面结构与业务逻辑的分离。
-
依赖属性系统:扩展了传统CLR属性系统,支持数据绑定、动画、继承和样式等高级功能。
-
强大的布局系统:
- 自适应布局容器(Grid、StackPanel、WrapPanel等)
- 逻辑单位和物理单位分离(设备无关单位)
- 弹性布局设计
-
丰富的数据绑定:
- 多种绑定模式(OneWay、TwoWay、OneTime等)
- 值转换器
- 集合变更通知
- 数据模板和选择器
-
样式和模板系统:
- 控件外观完全可自定义
- 样式继承
- 触发器和视觉状态
- 资源字典
-
路由事件系统:事件通过视觉树向上或向下传播,支持事件隧道和事件冒泡。
-
命令系统:将用户操作与应用程序逻辑分离,支持多种输入来源的统一处理。
-
文档功能:Flow Document和Fixed Document提供了丰富的文档处理能力。
-
3D支持:集成的3D图形系统,允许2D和3D内容混合。
-
媒体整合:原生支持视频和音频处理。
MVVM架构模式
WPF最重要的贡献之一是推广了MVVM(Model-View-ViewModel)架构模式。这一专为WPF设计的架构模式由微软架构师John Gossman于2005年提出,已成为现代UI框架的主流架构模式。
MVVM的核心组件:
- Model(模型):代表应用程序的数据和业务逻辑。
- View(视图):用户界面,在WPF中通常用XAML定义。
- ViewModel(视图模型):连接视图和模型的中间层,将模型数据转换为视图可以使用的形式,并处理视图的操作请求。
MVVM模式的优势:
- 关注点分离:界面与业务逻辑清晰分离,提高代码的可维护性。
- 可测试性:ViewModel可以独立于UI进行单元测试。
- 设计时数据:支持设计器中的数据预览,提升设计体验。
- 代码重用:ViewModel可以被多个View共享。
- 团队协作:设计师和开发者可以并行工作在同一应用的不同部分。
WPF的数据绑定系统和命令模式为MVVM的实现提供了天然支持,使得这一模式能够以最小的基础设施代码实现复杂的界面交互。
WPF在现代Windows开发中的地位与前景
当前市场定位
经过近20年的发展,WPF在Windows开发平台中已确立了自己的独特定位:
-
企业应用开发的主力:
- 在大型企业内部应用开发中保持强势
- 金融、医疗、工业控制等关键行业的首选技术
- 复杂业务应用的理想平台
-
高性能图形应用:
- 科学可视化
- 金融图表与分析
- 媒体处理应用
- CAD和建模工具
-
需要丰富UI的Windows桌面应用:
- 专业创意工具
- 复杂控制面板
- 多媒体创作软件
-
存量应用的现代化途径:
- WinForms应用的渐进式升级
- 传统桌面应用的UI改进
然而,WPF也面临一些局限:
- 仅限Windows平台:不支持跨平台开发,限制了在移动和Web领域的应用。
- 学习曲线陡峭:概念众多,入门难度较高。
- 与最新UI趋势同步需要额外工作:需要第三方控件或自定义工作来实现最新的UI设计趋势。
与其他微软UI技术的关系
在当前的微软Windows开发生态中,WPF与其他UI框架形成了互补关系:
技术 | 优势场景 | 与WPF的关系 |
---|---|---|
WinForms | 简单业务应用,快速开发 | 可通过ElementHost集成WPF控件 |
UWP/WinUI 3 | 现代UI,应用商店分发 | WPF可通过XAML Islands集成UWP控件 |
.NET MAUI | 跨平台应用 | 共享部分XAML概念,但针对不同场景 |
Blazor Desktop | Web技术桌面化 | 面向Web开发者的替代选择 |
Windows App SDK | 现代Windows API | WPF可以利用其API访问最新Windows功能 |
未来发展前景
展望未来,WPF仍将在Windows开发生态系统中扮演重要角色:
-
长期企业应用平台:
- 微软已承诺长期支持WPF,随.NET版本更新
- 企业系统投资保护和延续性
- 成熟稳定的技术栈
-
与Windows新技术融合:
- 通过Windows App SDK集成最新Windows功能
- 与WinUI控件和设计语言协同
- 逐步采纳现代UI趋势
-
性能和开发体验改进:
- 随着.NET的演进获得性能提升
- 现代化开发工具支持
- 持续的社区贡献和改进
-
混合应用架构:
- WPF与Web技术的混合(WebView2)
- 微服务架构中的富客户端
- 云服务的高性能前端
-
专业领域深耕:
- 继续在特定专业领域发挥优势
- 高性能图形和数据可视化
- 专业创意和工程工具
WPF的未来不在于取代新兴技术,而是继续在其擅长的领域保持优势,同时与新技术协同发展,为Windows平台提供强大的UI开发选择。
社区贡献与开源发展
随着2018年WPF完全开源,社区贡献成为WPF发展的重要部分:
-
GitHub参与度:
- 数千个问题和功能请求
- 数百个被接受的社区贡献
- 活跃的讨论和改进建议
-
第三方库与框架:
- Material Design In XAML Toolkit
- MahApps.Metro
- WPF-UI(Fluent设计实现)
- Prism、ReactiveUI等MVVM框架
- CommunityToolkit.WPF
-
设计资源共享:
- XAML样式和模板库
- 自定义控件集合
- 设计系统实现
-
新功能建议和投票:社区可以提出并投票决定新功能的优先级,影响WPF的发展方向。
开源转型不仅提高了WPF的透明度,也使其开发节奏更符合实际用户需求,成为现代.NET生态系统中健康发展的组成部分。
教育和学习资源
随着WPF技术的成熟,围绕其形成了丰富的教育和学习生态系统:
-
官方文档与教程:
- Microsoft Learn平台上的WPF文档
- .NET团队博客中的WPF更新和最佳实践
- 微软虚拟学院的WPF课程
-
书籍与出版物:
- 《WPF编程宝典》
- 《Pro WPF》系列
- 《Windows Presentation Foundation Unleashed》
- 《MVVM深入浅出》
-
在线课程平台:
- Pluralsight、Udemy等平台的专业课程
- YouTube频道中的WPF教程系列
- LinkedIn Learning的WPF开发路径
-
社区资源:
- Stack Overflow的WPF问答
- CodeProject上的WPF文章和示例
- 开发者博客中的深度教程
- GitHub上的示例项目和模板
-
会议与活动:
- .NET Conf中的WPF专题讲座
- 本地.NET用户组中的WPF讨论
- 专业技术大会中的WPF研讨会
这些资源使新开发者能够快速上手WPF,同时也帮助经验丰富的开发者不断提升技能,跟上最新的技术发展和最佳实践。
总结与展望
WPF的持久价值
WPF作为Windows平台上功能最强大的UI框架之一,经历了十多年的发展,从最初的革命性创新到如今的稳定成熟,证明了其持久的技术价值:
-
架构愿景实现:WPF最初设计的分离关注点、声明式UI、矢量图形等核心理念,如今已被广泛接受并影响了众多现代UI框架。
-
企业应用基石:在企业应用开发领域,WPF因其稳定性、表现力和丰富功能,仍然是首选技术之一。
-
专业领域深耕:在金融、医疗、工业控制等专业领域,WPF的高性能图形和数据处理能力难以替代。
-
设计方法论影响:MVVM模式从WPF发展而来,如今已成为众多现代UI框架采用的架构模式。
-
技术生态持续进化:开源转型后,WPF生态系统获得了新的活力,不断适应现代开发需求。
未来发展方向
展望未来,WPF的发展将继续沿着以下方向演进:
-
与.NET持续同步:随着.NET的每个新版本,WPF将获得性能改进和新特性支持。
-
现代化UI体验:通过社区和官方努力,持续改进WPF的现代UI能力,包括Fluent Design适配和新控件开发。
-
与新技术融合:更好地与WebView2、Windows App SDK等新技术集成,为应用提供现代化路径。
-
开发体验提升:改进设计工具、热重载体验和调试能力,提高开发效率。
-
社区驱动创新:更多依靠社区贡献来推动特定领域功能的创新和优化。
技术选择建议
在当前复杂的技术生态中,WPF适用于以下场景:
-
复杂业务应用:需要丰富数据处理、复杂布局和高度定制UI的企业应用。
-
高性能图形应用:需要处理大量视觉元素或复杂图形渲染的应用。
-
专业工具软件:CAD、创意工具、医疗系统等专业领域应用。
-
需要深度Windows集成:需要与Windows平台深度集成的应用。
-
现有WPF应用的现代化:为已有WPF应用提供逐步现代化的路径。
WPF的故事告诉我们,真正有价值的技术不仅取决于它的创新性,更在于它能否持续适应变化、解决实际问题,并在特定领域发挥长期价值。经过近二十年的发展,WPF已经证明了自己作为经典Windows UI技术的地位,并将继续在未来的Windows应用开发中扮演重要角色。
参考文献
[1] Microsoft. Windows Presentation Foundation Documentation[EB/OL]. Microsoft Learn, 2023[2023-12-01]. https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/
[2] Nathan A. WPF 4.5 Unleashed[M]. Indianapolis: Sams Publishing, 2013.
[3] MacDonald M. Pro WPF in C# 2020: Windows Presentation Foundation in .NET Core 3[M]. Berkeley: Apress, 2020.
[4] Gossman J. Introduction to Model/View/ViewModel pattern for building WPF apps[EB/OL]. (2005-10-08)[2023-12-01]. https://blogs.msdn.microsoft.com/johngossman/2005/10/08/introduction-to-modelviewviewmodel-pattern-for-building-wpf-apps/
[5] Microsoft. .NET Core 3 and Support for Windows Desktop Applications[EB/OL]. (2018-12-04)[2023-12-01]. https://devblogs.microsoft.com/dotnet/net-core-3-and-support-for-windows-desktop-applications/
[6] Brockschmidt K. Introducing Windows Presentation Foundation[J]. MSDN Magazine, 2006(1): 48-52.
[7] Sells C, Griffiths I. Programming WPF: Building Windows UI with Windows Presentation Foundation[M]. Sebastopol: O’Reilly Media, 2007.
[8] Microsoft. Windows Presentation Foundation (WPF) SDK[Z]. Redmond: Microsoft Corporation, 2006.
[9] Anderson C. Essential Windows Presentation Foundation[M]. Boston: Addison-Wesley Professional, 2007.
[10] Lowy J. Programming WPF: Windows Presentation Foundation in .NET 4.0[M]. Sebastopol: O’Reilly Media, 2010.
相关文章:
WPF的发展历程
文章目录 WPF的发展历程引言起源与背景(2001-2006)从Avalon到WPF设计目标与创新理念 WPF核心技术特点与架构基础架构与渲染模型关键技术特点MVVM架构模式 WPF在现代Windows开发中的地位与前景当前市场定位与其他微软UI技术的关系未来发展前景 社区贡献与…...
新书速览|OpenCV计算机视觉开发实践:基于Qt C++
《OpenCV计算机视觉开发实践:基于Qt C》 本书内容 OpenCV是计算机视觉领域的开发者必须掌握的技术。《OpenCV计算机视觉开发实践:基于Qt C》基于 OpenCV 4.10与Qt C进行编写,全面系统地介绍OpenCV的使用及实战案例,并配套提供全书示例源码、PPT课件与作…...
本地搭建一个简易版本的 Web3 服务
一、环境搭建与工具准备 (一)安装 Node.js 和 npm Node.js 是一个基于 JavaScript 的运行时环境,npm 是其默认的包管理器。在 Web3 开发中,Node.js 和 npm 是必不可少的工具。 访问 Node.js 官网 并下载最新的 LTS 版本。 安装…...
电脑安装CentOS系统
前言 电脑是Windows10系统,安装CentOS之前要将硬盘格式化,这个操作会将Windows10系统以及电脑上所有资料抹除,操作前务必谨慎复查是否有重要资料需要备份。 准备工作 准备两个U盘,一台电脑。提前把镜像下载好。镜像在百度网盘里…...
【Linux专栏】zip 多个文件不带路径
Linux && Oracle相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 1.背景 今天发现 Linux 解压缩的文件中,不光包含需要的文件,还保留了目录层级,不是想要的结果。因此,本文关于…...
邀请函 | 「软件定义汽车 同星定义软件」 TOSUN用户日2025·杭州站
参会邀请函 尊敬的客户及合作伙伴: 新能源汽车智能化浪潮席卷全球,杭州作为中国技术创新高地,正引领行业变革。为助力工程师伙伴应对行业挑战,解决工程难题,同星智能将于2025年5月9日(周五)在…...
start_response详解
start_response 是Python的WSGI(Web Server Gateway Interface)中的一个重要概念,它是一个可调用对象(通常是一个函数),在WSGI应用程序里发挥着关键作用,下面为你详细介绍。 作用 在WSGI规范里…...
记一次 .NET某旅行社酒店管理系统 卡死分析
一:背景 1. 讲故事 年初有位朋友找到我,说他们的管理系统不响应了,让我帮忙看下到底咋回事? 手上也有dump,那就来分析吧。 二:为什么没有响应 1. 线程池队列有积压吗? 朋友的系统是一个web系统&#…...
[预备知识]1. 线性代数基础
线性代数基础 线性代数是深度学习的重要基础,本章节将介绍深度学习中常用的线性代数概念和操作。 1. 标量、向量、矩阵与张量 1.1 标量(Scalar) 标量是单个数值,用 x ∈ R x \in \mathbb{R} x∈R 表示。在深度学习中常用于表…...
RESTful学习笔记(二)---简单网页前后端springboot项目搭建
新建项目: 项目结构 Pom.xml中添加依赖: 要有用于启动的父进程,有启动依赖,有lombok用于自动构建getter和setter方法等 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-…...
C++ AI模型部署优化实战:基于TensorRT的高效推理引擎开发
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...
[特殊字符] Prompt如何驱动大模型对本地文件实现自主变更:Cline技术深度解析
在AI技术快速发展的今天,编程方式正在经历一场革命性的变革。从传统的"人写代码"到"AI辅助编程",再到"AI自主编程",开发效率得到了质的提升。Cline作为一款基于VSCode的AI编程助手,通过其独特的pro…...
DevOps功能详解
DevOps 详解 1. 什么是 DevOps? DevOps 是 Development(开发) 和 Operations(运维) 的组合词,代表一种通过 自动化工具、协作文化 和 流程优化 来加速软件开发与交付的 方法论。其核心目标是打破开发与运维…...
忽略 CS8616 警告在 Visual Studio 2022 中【C# 8.0 】
CS8616 警告是 C# 8.0 引入的可空引用类型(NRT)相关警告,表示"由于可空引用类型的特性,某个不可为 null 的字段可能未被初始化"。 编辑项目csproj,直接删除<Nullable>enable</Nullable> 或者修改为disable或者annota…...
[架构之美]一键服务管理大师:Ubuntu智能服务停止与清理脚本深度解析
[架构之美]一键服务管理大师:Ubuntu智能服务停止与清理脚本深度解析 服务展示: 运行脚本: 剩余服务: 一、脚本设计背景与核心价值 在Linux服务器运维中,服务管理是日常操作的重要环节。本文介绍的智能服务管理脚本&a…...
23种设计模式-结构型模式之外观模式(Java版本)
Java 外观模式(Facade Pattern)详解 🧭 什么是外观模式? 外观模式是结构型设计模式之一,为子系统中的一组接口提供一个统一的高层接口,使得子系统更易使用。 就像是酒店前台,帮你处理入住、叫…...
《数据结构之美--双向链表》
引言 之前我们学习了单链表这一数据结构,虽然单链表的功能比较多,但是也存在着一些局限性,因为在单链表中节点的指向都是单向的,因此我们想从某个节点找到它的上一个节点比较困难,来不及再迷恋单链表了,接…...
如何判断设备是否支持带电插拔——从原理到实操的全面解析
点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万阅读 1.6万收藏 一、带电插拔的核心原理 带电插拔(热插拔)的本质是通过电气隔离设计和顺序通断控制,避免电流突变对设备造成损害。 • 触点分级设计:支持热…...
Google Store 如何利用 glTF 3D 模型改变产品教育
Google 为全球广大用户提供种类繁多、持续改进的硬件产品。Google 的智能手机、智能手表、耳机、平板电脑、智能家居设备等产品均通过 Google Store(谷歌商店) 以及遍布全球的实体和数字第三方零售商销售。作为一个以在人工智能、智能家居和个人设备体验方面不断开拓创新而闻名…...
Flutter 状态管理 Riverpod
Android Studio版本 Flutter SDK 版本 将依赖项添加到您的应用 flutter pub add flutter_riverpod flutter pub add riverpod_annotation flutter pub add dev:riverpod_generator flutter pub add dev:build_runner flutter pub add dev:custom_lint flutter pub add dev:riv…...
flutter 专题 六十六 Flutter Dio包网络请求抓包解决方案
在Flutter中进行网络请求时,我们可以使用的库有3个,即Http请求库、HttpClient请求库和Dio请求库(详细介绍请参考:Flutter开发之Http网络请求),使用得最多的就是Dio请求库。因为相比Http请求库和HttpClient请…...
DSL(Domain Specific Language,领域特定语言)
DSL的定义和作用 DSL是为特定业务领域设计的专门语言,这里特指为欺诈检测场景设计的规则描述语言通过DSL,业务人员可以用接近自然语言的方式定义欺诈检测规则,而不需要编写复杂的代码DSL的具体实现:使用ANTLR4作为语法解析工具支…...
基于SpringBoot的心情疗愈平台-项目分享
基于SpringBoot的心情疗愈平台-项目分享 项目介绍项目摘要管理员功能图用户实体图心理咨询师功能图系统功能图项目预览情感树洞发布帖子讲座信息心理医生心理医生管理 最后 项目介绍 使用者:管理员、用户、心理咨询师 开发技术:MySQLJavaSpringBootVue …...
富文本图片过大问题
在做若依的项目,碰到了若依自带的公告功能的图片上传后,再显示会出现图片过大的问题。在修改若依代码无果后,退而求其次修改展示页面的代码。 问题描述: 在若依框架的打卡系统中,公告使用富文本上传图片后࿰…...
Python-Django系列—部件
部件是 Django 对 HTML 输入元素的表示。部件处理 HTML 的渲染,以及从对应于部件的 GET/POST 字典中提取数据。 内置部件生成的 HTML 使用 HTML5 语法,目标是 <!DOCTYPE html>。例如,它使用布尔属性,如 checked…...
开发者视角:轻量便捷的AI视觉训推一体机如何实现AI模型快速开发
一、行业背景 1)数据与算力基础夯实:互联网、物联网和移动互联网的普及使得视觉数据呈爆发式增长,为AI视觉训推技术提供了丰富的“燃料”。同时,GPU、TPU等计算芯片的广泛使用,以及云计算的兴起,让计算能力…...
基于Python(Django)+SQLite实现(Web)校园助手
校园助手 本校园助手采用 B/S 架构。并已将其部署到服务器上。在网址上输入 db.uplei.com 即可访问。 使用说明 可使用如下账号体验: 学生界面: 账号1:123 密码1:123 账户2:201805301348 密码2:1 # --------------…...
Django 入门指南:构建强大的 Web 应用程序
什么是 Django? Django 是一个开源的高层次 Python Web 框架,旨在快速开发安全且可维护的网站。它通过简化常见的 Web 开发任务,帮助开发者专注于开发应用的核心功能。Django 实现了“快速开发”和“尽量少的重复”的理念,提供了…...
一文了解相位阵列天线中的真时延
本文要点 真时延是宽带带相位阵列天线的关键元素之一。 真时延透过在整个信号频谱上应用可变相移来消除波束斜视现象。 在相位阵列中使用时延单元或电路板,以提供波束控制和相移。 市场越来越需要更快、更可靠的通讯网络,而宽带通信系统正在努力满…...
LangChain实现PDF中图表文本多模态数据向量化及RAG应用实战指南
如何用LangChain实现PDF多模态数据向量化及RAG应用实战指南 在大模型应用中,PDF文档因包含文本、表格、图片等异构数据,成为RAG(检索增强生成)系统的核心挑战。本文基于LangChain框架,结合多模态处理技术,…...
OkHttp入门
OkHttp 简介与使用示例 OkHttp 是一个高效的 HTTP 客户端,用于 Android、Java 应用程序以及 Kotlin 应用程序。它支持同步阻塞调用和异步调用,同时提供了强大的拦截器和重定向处理功能。OkHttp 由 Square 公司开发,因其高性能和易用性而广受…...
在ARM Linux应用层下驱动MFRC522
文章目录 1、前言2、IC卡 和 IC卡读卡器3、MFRC5223.1、寄存器集3.2、命令集3.3、数据操作3.4、基础函数编写3.4.1、MFRC522接线3.4.2、编写SPI操作函数3.4.3、编写MFRC522基础函数3.4.3.1、完整的mfrc522.h3.4.3.2、写寄存器和读寄存器3.4.3.3、复位引脚操作3.4.3.4、天线操作…...
力扣第446场周赛
有事没赶上, 赛后模拟了一下, 分享一下我的解题思路和做题感受 1.执行指令后的得分 题目链接如下:力扣 给你两个数组:instructions 和 values,数组的长度均为 n。 你需要根据以下规则模拟一个过程: 从下标 i 0 的第一个指令开始…...
close和shutdown
1.shutdown() 控制 TCP 连接的读写方向,不会关闭文件描述符,也不会触发四次挥手。 shutdown(sockfd, SHUT_RD): 关闭套接字的读方向。套接字不能再接收数据。 shutdown(sockfd, SHUT_WR): 关闭套接字的写方向。套接字不能再发送数据。 shutdown(sockfd…...
LeetCode算法题(Go语言实现)_54
题目 给你两个正整数数组 spells 和 potions ,长度分别为 n 和 m ,其中 spells[i] 表示第 i 个咒语的能量强度,potions[j] 表示第 j 瓶药水的能量强度。 同时给你一个整数 success 。一个咒语和药水的能量强度 相乘 如果 大于等于 success &a…...
.NET应用UI框架DevExpress XAF v24.2新版亮点:支持.NET 9
DevExpress XAF是一款强大的现代应用程序框架,允许同时开发ASP.NET和WinForms。DevExpress XAF采用模块化设计,开发人员可以选择内建模块,也可以自行创建,从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。 在DevEx…...
前端通过jenkins和docker打包部署流程
通过jenkins实现镜像打包和上传 1.在jenkins上创建流水线任务 点击新建任务 填写任务名称 选多分支流水线 增加分支源 选git 添加并选择凭据(有项目权限的git账号密码) 填写分支的正则表达式,多分支使用^(分支名|分支名)$ 保存 …...
SpringBoot自定义验证器:企业级参数校验架构设计与实践
一、需求分析与技术选型 在复杂业务场景中,标准校验注解(如@NotBlank、@Pattern)往往无法满足特殊业务规则验证需求。例如: 需要校验字段值在预定义的枚举范围内多字段之间存在关联性校验(如起始时间不能晚于结束时间)需要动态查询数据库进行业务规则校验架构设计原则:…...
4U带屏基于DSP/ARM+FPGA+AI的电力故障录波装置设计方案,支持全国产化
4U带屏DSP/ARMFPGAAI电力故障录波分析仪,支持国产化,含有CPU主控模块,96路模拟量采集,256路开关量,通讯扩展卡等#电力故障录波#4U带屏#新能源#电力监测 主要特点 1)是采用嵌入式图形系统,以及…...
笔试题——第五周
目录 Day1 排序子序列 消减整数 最长上升子序列 Day2 爱吃素 相差不超过k的最多数 最长公共子序列(一) Day3 小红的口罩 春游 数位染色 Day4 素数回文 活动安排 合唱团 Day5 跳台阶扩展问题 包含不超过两种字符的最长子串 字符串的排列 Day6 ISBN号码 k…...
图论-Floyd算法
在搜索中bfs只适合无权图 若是碰到有权图最简单的方法就是用邻接矩阵-二维矩阵存储每个点对之间的权重,然后用floyd 并且邻接矩阵还可以处理重边的问题(用min) INFfloat(inf) ma[[INF]*n for _ in range(n)]for i in range(n):ma[i][i]0for i in rang…...
使用pyinstaller打包fastapi项目的问题记录
文章目录 PyInstaller 相关介绍作用使用方式Spec 文件介绍 FastAPI 相关介绍什么是 FastAPI?使用方式 使用 PyInstaller 打包 FastAPI 项目常见问题与解决方案 PyInstaller 相关介绍 作用 PyInstaller 是一个将 Python 程序打包成独立可执行文件的工具,…...
Java秒杀功能-案例
数据库表设计 CREATE TABLE user (id bigint(20) NOT NULL AUTO_INCREMENT,name varchar(100) NOT NULL,password varchar(100) NOT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8;CREATE TABLE order_info (id bigint(20) NOT NULL AUTO_INCREMENT,user_id bigi…...
Abp发布订阅
在 ABP(AspNet Boilerplate)框架里运用发布 - 订阅模式,有着多方面重要目的,以下为你详细阐述: 实现组件间的解耦 减少直接依赖:在传统的编程方式中,不同组件之间可能存在紧密的耦合关系&…...
docker部署ruoyi-vue-pro前后端详细笔记
docker部署ruoyi-vue-pro前后端详细笔记 参考:YuDaoCloud:Docker 部署 - 那个码农 1.准备工作 1.1 需要准备服务器,安装bt面板方便操作 if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/install_panel.sh;else wg…...
软考中级数据库系统工程师学习资料分享
软考中级数据库系统工程师考试对于很多 IT 从业者和计算机专业的大学生来说,是一个重要的职业资格认证。它不仅能够提升个人的专业技能,还能为职业发展增添有力的砝码。今天,我将为大家分享一套全面且实用的学习资料,帮助大家更好…...
RESTful学习笔记(一)
Web发展 一、API 程序硬件接口(Application Programming Interface),是预先定义好的逻辑函数,软件系统不同组成部分衔接的约定,直接调用函数,无序访问代码细节,分为SDK和Web应用接口两类 SDK…...
基于 FFmpeg 的音视频处理基础原理与实验探究
目录 1 基本知识1.1 解封装1.2 AAC和ADTS说明 1.3 H2641.3.1 H264编码结构解析1.3.2 NALU1.3.2 分类 2 实验1 探究音视频信息2.1 重要结构体介绍2.2 相关的API 3 实验二 提取AAC数据4 实验三 提取h264 1 基本知识 1.1 解封装 封装的逆向操作:封装是把音频流、视频流…...
spark和hadoop的区别
一、核心定位与架构差异 Hadoop • 定位:分布式存储与计算的基础框架,核心解决海量数据的存储(HDFS)和离线批处理计算(MapReduce)问题,适合对实时性要求不高的大规模数据离线处理场景。 • 架构…...
vue使用语音识别
vue使用语音识别 使用 Web Speech API 实现语音识别功能 语音转换的原理可以简单概括为以下几个步骤: 声音捕捉:将声波转化为数字信号。特征提取:分析声音中的关键特征。声学模型:将声音特征与音素匹配。语言模型:根据…...