WPF開發(fā)個人記賬系統(tǒng):MVVM與SQLite實戰(zhàn)
1. 項目概述個人記賬小系統(tǒng)的核心價值這個個人記賬小系統(tǒng)是我在業(yè)余時間開發(fā)的一個輕量級財務(wù)管理工具主要解決日常收支記錄的痛點。相比市面上復(fù)雜的記賬軟件它去除了所有冗余功能保留了最核心的記賬、統(tǒng)計和報表功能。整個系統(tǒng)采用WPF框架開發(fā)界面簡潔直觀數(shù)據(jù)存儲在本地SQLite數(shù)據(jù)庫中既保證了隱私性又免去了網(wǎng)絡(luò)依賴。提示系統(tǒng)源碼完全開放特別適合.NET開發(fā)者學(xué)習(xí)WPF數(shù)據(jù)綁定、LINQ查詢和圖表繪制的實戰(zhàn)應(yīng)用我最初開發(fā)這個系統(tǒng)的動機(jī)很簡單市面上的記賬App要么功能太臃腫要么充斥著廣告。作為一個程序員我更想要一個能完全掌控的、可以隨時自定義功能的解決方案?,F(xiàn)在這個版本已經(jīng)穩(wěn)定運行了兩年多期間根據(jù)實際使用反饋迭代了十幾個小版本。2. 系統(tǒng)架構(gòu)與技術(shù)選型2.1 前端界面設(shè)計系統(tǒng)采用WPF的MVVM模式開發(fā)主要使用了以下布局控件DockPanel主窗口的基礎(chǔ)布局Grid數(shù)據(jù)表格的精確排版StackPanel工具欄的垂直/水平排列TabControl不同功能模塊的切換!-- 典型布局示例 -- DockPanel Menu DockPanel.DockTop.../Menu StatusBar DockPanel.DockBottom.../StatusBar TabControl TabItem Header記賬 Grid Grid.RowDefinitions.../Grid.RowDefinitions StackPanel OrientationHorizontal.../StackPanel /Grid /TabItem /TabControl /DockPanel2.2 后端數(shù)據(jù)處理數(shù)據(jù)層采用Entity Framework Core操作SQLite主要實體包括Transaction記錄每筆交易的金額、類型、分類、時間等Category收支分類體系可自定義Budget預(yù)算設(shè)置Account多賬戶管理// 典型數(shù)據(jù)模型 public class Transaction { public int Id { get; set; } public decimal Amount { get; set; } public DateTime Date { get; set; } public string Description { get; set; } public TransactionType Type { get; set; } public int CategoryId { get; set; } public Category Category { get; set; } }2.3 圖表可視化使用LiveCharts庫實現(xiàn)動態(tài)圖表支持月度收支趨勢折線圖分類占比餅圖年度對比柱狀圖預(yù)算完成度儀表盤3. 核心功能實現(xiàn)詳解3.1 交易記錄的CRUD操作記賬系統(tǒng)的核心是交易記錄的增刪改查。我采用了Repository模式進(jìn)行封裝主要技術(shù)點包括異步數(shù)據(jù)加載使用async/await避免UI卡頓數(shù)據(jù)驗證在ViewModel層實現(xiàn)IDataErrorInfo批量操作支持CSV導(dǎo)入導(dǎo)出// 典型ViewModel代碼 public class TransactionViewModel : INotifyPropertyChanged, IDataErrorInfo { private readonly ITransactionRepository _repository; public async Task LoadDataAsync() { Transactions new ObservableCollectionTransaction( await _repository.GetByDateRangeAsync(StartDate, EndDate)); } public string Error null; public string this[string columnName] { get { if (columnName nameof(Amount) Amount 0) return 金額必須大于0; return null; } } }3.2 統(tǒng)計報表生成報表系統(tǒng)采用策略模式支持多種統(tǒng)計維度按日/周/月/年的收支匯總分類對比分析預(yù)算執(zhí)行情況賬戶余額變動統(tǒng)計引擎的核心是LINQ查詢例如// 月度統(tǒng)計示例 var monthlyStats transactions .GroupBy(t new { t.Date.Year, t.Date.Month }) .Select(g new { Year g.Key.Year, Month g.Key.Month, Income g.Where(t t.Type TransactionType.Income).Sum(t t.Amount), Expense g.Where(t t.Type TransactionType.Expense).Sum(t t.Amount) }) .OrderBy(x x.Year) .ThenBy(x x.Month);3.3 數(shù)據(jù)備份與恢復(fù)考慮到數(shù)據(jù)安全性實現(xiàn)了以下機(jī)制自動備份每天首次啟動時自動備份數(shù)據(jù)庫手動導(dǎo)出支持導(dǎo)出為JSON/CSV格式云同步可選通過Web API與自建服務(wù)器同步備份核心代碼public async Task BackupDatabaseAsync(string backupPath) { var dbPath GetDatabasePath(); using (var source File.OpenRead(dbPath)) using (var dest File.Create(backupPath)) { await source.CopyToAsync(dest); } }4. 開發(fā)中的關(guān)鍵問題與解決方案4.1 數(shù)據(jù)綁定性能優(yōu)化初期當(dāng)交易記錄超過5000條時界面會出現(xiàn)明顯卡頓。通過以下措施優(yōu)化虛擬化容器使用VirtualizingStackPanel分頁加載每次只加載當(dāng)前月的記錄延遲渲染對圖表數(shù)據(jù)采用按需加載!-- ListView虛擬化示例 -- ListView VirtualizingStackPanel.IsVirtualizingTrue VirtualizingStackPanel.VirtualizationModeRecycling ListView.ItemTemplate.../ListView.ItemTemplate /ListView4.2 多主題切換實現(xiàn)為滿足不同用戶的視覺偏好實現(xiàn)了動態(tài)換膚功能定義資源字典存儲不同主題的顏色和樣式使用ResourceDictionary.MergedDictionaries動態(tài)切換配合MahApps.Metro等UI庫增強(qiáng)效果public void ApplyTheme(string themeName) { var themeDict new ResourceDictionary { Source new Uri($Themes/{themeName}.xaml, UriKind.Relative) }; Application.Current.Resources.MergedDictionaries[0] themeDict; }4.3 跨平臺兼容性處理雖然主要面向Windows但通過以下方式提升了兼容性使用.NET Core 3.1/NET 5而非傳統(tǒng).NET Framework避免調(diào)用Windows特有API數(shù)據(jù)庫層使用跨平臺的SQLite5. 項目部署與使用指南5.1 開發(fā)環(huán)境搭建安裝Visual Studio 2019/2022社區(qū)版即可確保勾選.NET桌面開發(fā)工作負(fù)載克隆源碼倉庫git clone https://example.com/accounting-system.git還原NuGet包dotnet restore5.2 數(shù)據(jù)庫初始化系統(tǒng)首次運行時會自動創(chuàng)建數(shù)據(jù)庫結(jié)構(gòu)如需手動初始化dotnet ef database update5.3 自定義配置通過修改appsettings.json可以調(diào)整默認(rèn)貨幣符號日期顯示格式備份保留天數(shù)主題顏色{ AppSettings: { CurrencySymbol: ¥, DateFormat: yyyy-MM-dd, BackupRetentionDays: 7, DefaultTheme: Light } }6. 擴(kuò)展開發(fā)建議基于現(xiàn)有系統(tǒng)可以進(jìn)一步擴(kuò)展多用戶支持添加登錄系統(tǒng)和數(shù)據(jù)隔離智能分類利用機(jī)器學(xué)習(xí)自動識別交易類型賬單提醒集成系統(tǒng)通知功能投資跟蹤添加股票、基金等投資記錄移動端適配通過MAUI實現(xiàn)跨平臺對于想學(xué)習(xí)WPF的開發(fā)者這個項目提供了很好的起點。我在代碼中刻意保持了簡潔性每個核心功能模塊都控制在300行以內(nèi)方便理解。特別推薦重點研究MainWindowViewModel.csMVVM模式的典型實現(xiàn)TransactionRepository.csEF Core的最佳實踐ChartHelper.cs動態(tài)圖表的數(shù)據(jù)綁定技巧實際開發(fā)中最大的教訓(xùn)是不要過早優(yōu)化。初期我花了太多時間設(shè)計完美架構(gòu)后來發(fā)現(xiàn)對于個人項目快速迭代才是關(guān)鍵。現(xiàn)在這個版本已經(jīng)是第三次重構(gòu)后的結(jié)果每次重構(gòu)都讓代碼更簡潔、更易維護(hù)。

相關(guān)新聞

海外小公司 Offer 藏著離職違約金?用就業(yè)合同審核清單合規(guī)避坑「蒸汽求職分享」

海外小公司 Offer 藏著離職違約金?用就業(yè)合同審核清單合規(guī)避坑「蒸汽求職分享」

在海外求職的拉鋸戰(zhàn)里,拿到 Offer 的那一刻無疑讓人松了一方面大氣。尤其是在大廠招聘緊縮的環(huán)境下,手頭能握著一個本地初創(chuàng)公司、中小型企業(yè)或中介機(jī)構(gòu)的 Offer,很多同學(xué)恨不得立刻大筆一揮簽下名字。然而,盲目沖動地在英文雇傭合…

2026/7/31 2:24:52 閱讀更多
[Android ] 自動滑動屏幕器 AutoSlide v2.5.2

[Android ] 自動滑動屏幕器 AutoSlide v2.5.2

[Android ] 自動滑動屏幕器 AutoSlide v2.5.2 鏈接:https://pan.xunlei.com/s/VOyn5SeJcqYjuVq7amd63yTsA1?pwdsyte# 一款免費開源的專為測試與內(nèi)容瀏覽設(shè)計的屏幕自動滑動工具。其采用Kotlin架構(gòu)開發(fā),通過模擬手指滑動行為,無需root執(zhí)行…

2026/7/31 2:14:52 閱讀更多
Multisim仿真:中心抽頭式全波整流電路

Multisim仿真:中心抽頭式全波整流電路

這次搭建的是一個簡單的中心抽頭式全波整流電路。相比半波整流,它能利用交流電的兩個半周,因此輸出波形更連續(xù)。一、電路組成本次使用的元器件:交流電源:5 Vrms、50 Hz中心抽頭變壓器:10:5:5二極管:1N4007 …

2026/7/31 4:34:56 閱讀更多
蝸牛學(xué)苑 Java 學(xué)習(xí) Day14|多線程入門、線程同步思維導(dǎo)圖復(fù)盤

蝸牛學(xué)苑 Java 學(xué)習(xí) Day14|多線程入門、線程同步思維導(dǎo)圖復(fù)盤

一、思維導(dǎo)圖整體知識結(jié)構(gòu)梳理本次學(xué)習(xí)內(nèi)容分為四大核心模塊:多線程基礎(chǔ)概念、多線程三種實現(xiàn)方式、線程安全與同步機(jī)制、Lock 鎖與 Lambda 簡化寫法,是 Java 并發(fā)編程入門核心內(nèi)容。(一)多線程基本概念進(jìn)程:操作系統(tǒng)獨…

2026/7/31 4:34:56 閱讀更多
國產(chǎn)假面騎士W迷失驅(qū)動器1.5版測評:開箱、功能與改裝指南

國產(chǎn)假面騎士W迷失驅(qū)動器1.5版測評:開箱、功能與改裝指南

最近入手了國產(chǎn)版的假面騎士W迷失驅(qū)動器1.5版本,作為特攝劇《假面騎士W》中的經(jīng)典變身道具,這款產(chǎn)品在還原度和可玩性方面都有不少值得探討的地方。本文將圍繞這款產(chǎn)品的開箱體驗、功能細(xì)節(jié)、材質(zhì)做工以及性價比進(jìn)行全面測評,適合特攝愛好者、…

2026/7/31 4:34:56 閱讀更多
從RNN到Transformer:序列建模的技術(shù)演進(jìn)與實現(xiàn)

從RNN到Transformer:序列建模的技術(shù)演進(jìn)與實現(xiàn)

1. 從RNN到Transformer:序列建模的范式革命2017年那篇名為《Attention Is All You Need》的論文像一顆核彈在AI領(lǐng)域引爆,徹底改變了我們處理序列數(shù)據(jù)的方式。當(dāng)時我還在用LSTM做文本生成,每次訓(xùn)練都要忍受漫長的等待和梯度消失的折磨。Transf…

2026/7/31 4:34:56 閱讀更多
SpringBoot醫(yī)療智能推薦系統(tǒng)設(shè)計與實現(xiàn)

SpringBoot醫(yī)療智能推薦系統(tǒng)設(shè)計與實現(xiàn)

1. 項目背景與核心價值在當(dāng)前的數(shù)字化醫(yī)療浪潮中,智能推薦系統(tǒng)正逐步改變傳統(tǒng)衛(wèi)生健康服務(wù)的供給模式。這個基于SpringBoot的智能推薦衛(wèi)生健康系統(tǒng),本質(zhì)上是一個融合了機(jī)器學(xué)習(xí)算法與醫(yī)療健康數(shù)據(jù)的決策支持平臺。我在實際醫(yī)療信息化項目實施中發(fā)現(xiàn)&…

2026/7/31 4:34:56 閱讀更多
HashiCorp 聯(lián)合創(chuàng)始人再創(chuàng)業(yè)!Superlogical 要打造開發(fā)者的“全能”會話體系

HashiCorp 聯(lián)合創(chuàng)始人再創(chuàng)業(yè)!Superlogical 要打造開發(fā)者的“全能”會話體系

Mitchell Hashimoto 這位全球知名的基礎(chǔ)設(shè)施開源作者又有新動作,他創(chuàng)立了 Superlogical 公司,致力于打造“all work 的 multiplexer”,為開發(fā)者帶來全新的工作體驗。創(chuàng)始人的輝煌履歷Mitchell Hashimoto 是全球最有影響力的基礎(chǔ)設(shè)施開源作者之…

2026/7/31 4:24:55 閱讀更多
HART協(xié)議詳解:05 HART現(xiàn)場通信實戰(zhàn)

HART協(xié)議詳解:05 HART現(xiàn)場通信實戰(zhàn)

第五季 HART現(xiàn)場通信實戰(zhàn) ——從USB-HART Modem抓包到工程診斷:讓協(xié)議知識變成維修能力 各位工業(yè)現(xiàn)場的工程師朋友們,大家好! 經(jīng)過前四季的系統(tǒng)學(xué)習(xí),我們已經(jīng)構(gòu)建了HART協(xié)議的完整理論框架: 第一季:六層生命模型與本質(zhì)認(rèn)知 第二季:物理層4–20mA與FSK魔法 第三季:數(shù)…

2026/7/31 0:14:40 閱讀更多
維修工程師的示波器實戰(zhàn):02 探頭地線——示波器最大的“坑”

維修工程師的示波器實戰(zhàn):02 探頭地線——示波器最大的“坑”

第二篇:探頭地線——示波器最大的“坑” ——那根不起眼的小地線,可能比你測的信號還重要 很多工程師第一次用示波器時,都會經(jīng)歷這樣一個“驚魂”時刻。 某食品廠包裝線,伺服偶發(fā)報警。年輕工程師判斷是編碼器信號受干擾,便拿出示波器認(rèn)真測量。波形一出來,所有人都倒…

2026/7/31 0:14:40 閱讀更多