视频加载失败

PaperCoin 开源项目学习指南:从零到一看懂 WPF 记账应用

1438 字
7 分钟
PaperCoin 开源项目学习指南:从零到一看懂 WPF 记账应用

前言#

PaperCoin 是一款 Windows 桌面记账应用,用 WPF + .NET 10 编写。每天打开记一笔收支,数据存成本地 JSON 文件,支持 Dark/Bright/跟随系统三种主题,所有交互动画统一交给一个叫 LAE 的动画引擎驱动。

它的代码体量适中、架构清晰、注释充分,非常适合作为学习 WPF + MVVM + DI 的实战项目。本文是一份完整的学习路线指南,帮你规划从”看不懂代码”到”能动手改”的全过程。

Note

本文围绕 PaperCoin 项目展开,但其中涉及的 MVVM 分层思想、依赖注入、WPF 自定义控件、动画引擎等知识,对学习任何一个 WPF/桌面应用项目都有帮助。


三句话认识这个项目#

  1. 它是什么:Windows 桌面记账应用,支持当日账单、日历查询、分类管理。
  2. 它用什么写:WPF + .NET 10、CommunityToolkit.Mvvm、Microsoft.Extensions.DependencyInjection、Serilog、LAE(自研动画引擎)。没有数据库框架,数据全部存成 JSON 文件。
  3. 它最大的特点:分层架构极简且干净——Core(领域模型)、Service(持久化/配置/主题)、WPF 界面层,三层单向依赖,每一层的职责一眼就能看明白。

推荐学习顺序#

顺序文章内容适合谁预计耗时
1项目架构详解三层设计 + 启动流程 + 数据流想先看懂全貌的人1-2 小时
2核心代码导读(上)领域模型、持久化、配置与主题准备深入源码的人2-3 小时
3核心代码导读(下)UI 层、自定义控件、动画、ViewModel准备深入源码的人2-3 小时

每篇之间隔一两天,记忆更牢。卡住了就打开项目源码对照着看——项目代码里的注释同样非常详尽。

如果只想尽快把项目跑起来,克隆代码后直接 dotnet run,不需要装数据库、不需要配环境变量——PaperCoin 是零依赖启动的。


项目技术栈一览#

层级技术说明
语言C# 13(.NET 10)微软官方推荐的桌面开发语言
UIWPF(XAML + 代码后置)原生 Windows 桌面框架
MVVMCommunityToolkit.Mvvm 8.4ObservableObject + [ObservableProperty] 源生成器
DIMicrosoft.Extensions.DependencyInjection微软官方的依赖注入容器
配置Microsoft.Extensions.ConfigurationJSON 配置文件读写,支持热重载
日志Serilog控制台 + 按天滚动文件
动画LAE(Lively Animation Engine)自研轻量动画引擎,驱动所有过渡动效
构建.NET SDKdotnet build 一把梭

从学习角度来说,这个技术栈非常”干净”——没有 Prism、没有 ReactiveUI、没有数据库 ORM。每行代码都能追溯到它为什么存在。


需要准备什么#

  • 会一点 C# 基础(类、属性、接口、泛型);
  • 一台 Windows 电脑(WPF 只跑在 Windows 上);
  • 装了 .NET 10 SDK(或更高版本);
  • 耐心。零基础读 WPF 代码,第一遍不懂很正常,照着文档翻第二遍就通了。

环境要求#

需要版本
.NET SDK10.0 或以上
操作系统Windows 10/11
IDEVisual Studio 2022 或 JetBrains Rider(可选,命令行也能跑)

项目代码在哪#

项目开源在 GitHub:https://github.com/ksayus/PaperCoin

克隆后,在项目根目录执行:

Terminal window
cd PaperCoin
dotnet run --project PaperCoin/PaperCoin.csproj

不需要装数据库、不需要配环境变量。应用首次启动会在程序目录下自动创建 PaperCoin/ 数据目录(含 Config/、Logs/、Bills/ 三个子目录)。


核心概念预览#

在深入阅读之前,先记住三个最核心的概念,它们贯穿整个项目:

BillEntry —— 一条账单流水#

BillEntry 是项目的核心领域模型。一条流水包含:描述(description)、金额(amount,正数为收入、负数为支出)、分类(category)、日期(date)。它同时也是列表卡片的绑定源——画面上每一行账单的背后就是一个 BillEntry 对象。

BillRepository —— 全局账单仓库#

一个单例服务,用内存索引 + 磁盘 JSON 文件管理所有账单。磁盘布局为 Bills/yyyy/M/d/bills.json,年/月/日本身就是路径的一部分,因此没有独立索引文件。查询时遍历目录构建内存索引,之后常驻内存。

ThemeManager —— 主题管理#

管理 Dark/Bright/System 三种主题模式。System 模式会读 Windows 注册表探测当前系统主题。主题切换不是替换整个 ResourceDictionary 实例(那样会破坏 DynamicResource 缓存),而是在原字典里原地改写每个 key 的值,并给颜色变化挂一段 300ms 的过渡动画。


两条铁律(改代码前必读)#

  1. 金额约定:正数为收入,负数为支出。AmountText 手动补正负号,不用 N2 格式串——因为 N2 对负数的输出受系统区域设置影响。
  2. 写操作都在 _writeGate 信号量内串行。BillRepository 的保存/删除/更新全部由 _writeGate 信号量保护,因为保存是即发即忘的,两个写句柄落在同一个文件会让后一个抛 IOException。

系列文章导航#

本系列共三篇文章,建议按顺序阅读:

  1. 项目架构详解 —— 三层设计(Core/Service/WPF)、一次启动的完整流程、依赖注入容器配置、数据从界面到磁盘的完整路径。想看懂全貌必读。
  2. 核心代码导读(上) —— 逐文件精读 Core 层(领域模型、常量)+ Service 层(持久化、配置、主题、安装位置)。准备深入源码必读。
  3. 核心代码导读(下) —— 逐文件精读 UI 层(启动流程、主窗口、主题渲染器、自定义控件、ViewModel、Views 交互动画、冒烟测试)。准备深入源码必读。

快速跳转:如果你只想看懂”数据怎么存、主题怎么切”,直接跳到第 1 篇;如果你想逐行精读代码,按顺序读第 2、3 篇。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

PaperCoin 开源项目学习指南:从零到一看懂 WPF 记账应用
https://ksayus.top/posts/papercoin-learning-guide/
作者
Ksayus
发布于
2026-10-03
许可协议
GPLv3
相关文章智能推荐
1
ManyCourse 开源项目学习指南:从零到一看懂 Kotlin Android 课表应用
技术教程面向 Kotlin 零基础学习者的 ManyCourse(课多多)项目学习路线图,介绍项目概况、学习顺序、环境准备,以及如何从看懂代码到动手修改的全过程。
2
PaperCoin 项目架构详解:从启动到存盘的三层设计
技术教程深入解析 PaperCoin WPF 记账应用的三层架构设计,包括 Core(领域模型)/Service(持久化与配置)/WPF UI 各层职责、一次启动的完整流程、DI 容器配置,以及数据从界面到磁盘的完整路径。
3
PaperCoin 核心代码导读(上):领域模型、持久化与主题
技术教程逐文件精读 PaperCoin 的 Core 层(领域模型、常量)和 Service 层(持久化、配置读写、主题管理、安装位置),深入理解无数据库 JSON 文件存储、内存索引构建、主题三模式解析等核心设计。
4
PaperCoin 核心代码导读(下):UI 层、动画与冒烟测试
技术教程逐文件精读 PaperCoin 的 WPF UI 层,包括启动流程、主窗口导航与指示器动画、主题颜色运行时过渡、自定义开关控件、ViewModel 数据绑定、Views 交互动画,以及不依赖测试框架的 UI 冒烟测试方案。
5
ManyCourse 项目架构详解:四层设计从 UI 到网络
技术教程深入解析 ManyCourse(课多多)Android 课表应用的四层架构设计,包括 ui/data/gr_api/api 各层职责、一次登录的完整数据流、以及三个最核心的概念(SchoolApi 接口、SchoolRegistry 清单、CourseRepository 仓库)。
随机文章随机推荐

评论区

Profile Image of the Author
Ksayus
细碎的美好也是生活的意义
Ksayus の 猫窝
This is Ksayus`s blog, is will be write some tech article.
分类
标签
最新动态
站点统计
文章
35
分类
7
标签
111
总字数
58,408
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.16.8
文章许可
GPLv3
文章目录