人工精选WPF记事本开发详解/Notepad/MVVM/.NET/C#
这门课解决什么问题 如果你用过 Windows 自带的记事本,就知道它虽然简陋但很能打。这门课的目标就是用 WPF 和 C# 从零开始复现一个功能完整的记事本应用,涵盖界面设计、菜单交互、文件操作、快捷键绑定,甚至字体对话框这样的细节功能。不是单纯讲 WPF 语法和控件用法,而是通过一个真实的桌面应
会员 · 按档位
游客按标价购买,不享受上表折扣。
支付成功后自动发放网盘链接,链接失效可找客服免费补
这门课解决什么问题
如果你用过 Windows 自带的记事本,就知道它虽然简陋但很能打。这门课的目标就是用 WPF 和 C# 从零开始复现一个功能完整的记事本应用,涵盖界面设计、菜单交互、文件操作、快捷键绑定,甚至字体对话框这样的细节功能。不是单纯讲 WPF 语法和控件用法,而是通过一个真实的桌面应用项目,让你看到从界面搭建到功能实现再到代码架构的完整过程。特别适合想进阶 .NET 桌面开发,但又觉得官方文档太碎片化的人——这里有一条清晰的施工路线。
核心难点在 MVVM 架构落地。很多人学完 WPF 基础后,代码逻辑还是混在 CodeBehind 里,界面和业务纠缠不清。这门课通过逐步引入 ViewModel、命令绑定、属性通知机制,最后用成熟的自动更新框架,演示如何把一个"能跑的代码"重构成"可维护的结构"。
适合什么基础,怎么学
你需要懂 C# 基础语法和面向对象概念,对 WPF 或 XAML 没有要求。课程分三个阶段递进:
- 界面与基础功能(前 6 节):学会在 WPF 里用 Grid、StackPanel 组织布局,组装菜单和状态栏,提取图标资源。这部分是可视化的,进度快,能快速建立信心。建议一天内完成,为后续架构铺垫。
- MVVM 架构实战(第 7~14 节):从 ViewModel 的命令绑定开始,逐步引入数据绑定、属性通知,最后用框架代替手写代码。这是重点且有递进关系,每一节都在前一节基础上迭代,不要跳看。这部分涉及思维转变,需要边看边动手敲代码。
- 实战细节处理(第 15~18 节):逆向分析原版 Notepad 的字体对话框实现,处理 WPF 与 Windows 字体系统的差异。这部分演示如何从既有软件中学习设计思路,也暴露实际开发中的坑。
建议学习顺序是按节次顺序推进,不要跳选。界面部分可以快速扫过,但 MVVM 部分必须放慢速度,每看完一个模块就停下来自己动手敲一遍代码,不要只听讲解。
学完能做什么,资料怎么配合练习
学完后你能独立:用 WPF 写有完整菜单、快捷键、文件操作的桌面应用;用 MVVM 模式组织代码,让 View 层和业务逻辑分离;处理绑定、命令、属性通知这些 WPF 里的常见问题;对接系统 API 完成字体转换这样的集成需求。
关键在于把学到的架构思路迁移到自己的项目里。课程用的是小项目(记事本),但 MVVM 的套路直接适用于企业级应用。字体转换那部分涉及系统 API 调用和格式转换,这类问题在真实开发中经常出现,必须实际跑一遍代码,感受细节处理,不要只听讲解。完整做一遍项目比单纯看视频重要——这样才能把 MVVM 的思维方式变成实战能力,而不是听过就忘。建议在学完每个阶段后,尝试自己修改一个功能或添加一个小需求,检验理解程度。
课程目录
课程目录72 集
- 1-1 [WPF记事本开发详解] 课程介绍 (11:19).mp4
- 1-2 [WPF记事本开发详解] 界面设计:主界面拆分和组装 (09:03).mp4
- 1-3 [WPF记事本开发详解] 界面设计:菜单组装和样式调整 (12:23).mp4
- 1-4 [WPF记事本开发详解] 界面设计:状态栏组装 (09:06).mp4
- 1-5 [WPF记事本开发详解] 工具使用:从其它软件中提取图标 (06:44).mp4
- 1-6 [WPF记事本开发详解] 功能实现:实现帮助菜单中的功能 (19:08).mp4
- 1-7 [WPF记事本开发详解] MVVM:用ViewModel中的命令代替CodeBehid (13:30).mp4
- 1-8 [WPF记事本开发详解] MVVM:用ViewModel中的命令代替CodeBehid (09:34).mp4
- 1-9 [WPF记事本开发详解] MVVM:Model的创建和使用 (10:55).mp4
- 1-10 [WPF记事本开发详解] MVVM:快捷键的命令绑定 (08:04).mp4
- 1-11 [WPF记事本开发详解] MVVM:View上的数据绑定与自动更新 (17:59).mp4
- 1-12 [WPF记事本开发详解] MVVM:换用成熟的自动更新代码(1) (11:31).mp4
- 1-13 [WPF记事本开发详解] MVVM:换用成熟的自动更新代码(2) (11:14).mp4
- 1-14 [WPF记事本开发详解] MVVM:鼠标滚轮的命令绑定 (15:15).mp4
- 1-15 [WPF记事本开发详解] 逆向分析:原版Notepad中的字体对话框(1) (15:16).mp4
- 1-16 [WPF记事本开发详解] 逆向分析:原版Notepad中的字体对话框(2) (17:49).mp4
- 1-17 [WPF记事本开发详解] 字体转换:WFP字体与Windows字体的转换(1) (14:35).mp4
- 1-18 [WPF记事本开发详解] 字体转换:WFP字体与Windows字体的转换(2) (11:38).mp4
- 1-19 [WPF记事本开发详解] 内置命令:WFP的内置命令库的使用 (17:37).mp4
- 1-20 [WPF记事本开发详解] 内置命令:WPF的内置命令库的注册和使用 (11:48).mp4
- 1-21 [WPF记事本开发详解] 窗口外观:把WPF窗口调整成一个对话框外观 (14:37).mp4
- 1-22 [WPF记事本开发详解] 窗口外观:拆分和组装“替换”对话框 (15:53).mp4
- 1-23 [WPF记事本开发详解] 窗口外观:拆分和组装“查找”对话框(2) (15:15).mp4
- 1-24 [WPF记事本开发详解] MVVM:接收命令中的参数,执行带参数的命令 (18:54).mp4
- 1-25 [WPF记事本开发详解] MVVM:用消息(Messenger)作为桥梁来解除耦合1 (11:13).mp4
- 1-26 [WPF记事本开发详解] MVVM:用消息(Messenger)作为桥梁来解除耦合2 (16:47).mp4
- 1-27 [WPF记事本开发详解] MVVM:用控制反转(IoC)技术来解除耦合(1) (11:43).mp4
- 1-28 [WPF记事本开发详解] MVVM:用控制反转(IoC)技术来解除耦合(2) (13:17).mp4
- 1-29 [WPF记事本开发详解] MVVM:使用事件触发器向Model传送特殊数据(1) (10:35).mp4
- 1-30 [WPF记事本开发详解] MVVM:使用事件触发器向Model传送特殊数据(2) (16:07).mp4
- 1-31 [WPF记事本开发详解] 代码实现:“查找”对话框的逻辑实现(1) (14:00).mp4
- 1-32 [WPF记事本开发详解] 代码实现:“查找”对话框的逻辑实现(2) (10:59).mp4
- 1-33 [WPF记事本开发详解] 代码实现:关闭“查找”对话框 (13:03).mp4
- 1-34 [WPF记事本开发详解] 代码实现:软件配置加载、保存及对象序列化(1) (11:12).mp4
- 1-35 [WPF记事本开发详解] 代码实现:软件配置加载、保存及对象序列化(2) (11:52).mp4
- 1-36 [WPF记事本开发详解] 代码实现:“查找上一个”与“查找下一个” (10:45).mp4
- 1-37 [WPF记事本开发详解] 代码实现:“替换”窗口的逻辑实现(1) (10:46).mp4
- 1-38 [WPF记事本开发详解] 代码实现:“替换”窗口的逻辑实现(2) (12:17).mp4
- 1-39 [WPF记事本开发详解] MVVM:控制反转(IoC)中的依赖注入(DI) (14:19).mp4
- 1-40 [WPF记事本开发详解] 代码实现:“转到指定行”的逻辑实现(1) (14:57).mp4
- 1-41 [WPF记事本开发详解] 代码实现:“转到指定行”的逻辑实现(2) (15:20).mp4
- 1-42 [WPF记事本开发详解] 代码实现:用于窗口标题的多值转换器 (11:58).mp4
- 1-43 [WPF记事本开发详解] 逆向分析:“另存为”对话框中的“坑” (09:18).mp4
- 1-44 [WPF记事本开发详解] 逆向分析:Notepad中的“另存为”对话框 (14:02).mp4
- 1-45 [WPF记事本开发详解] 逆向分析:拆解Notepad中的“另存为”对话框(1) (09:05).mp4
- 1-46 [WPF记事本开发详解] 逆向分析:拆解Notepad中的“另存为”对话框(2) (17:29).mp4
- 1-47 [WPF记事本开发详解] 逆向分析:拆解Notepad中的“另存为”对话框(3) (11:51).mp4
- 1-48 [WPF记事本开发详解] C++编码:组装Notepad中的“另存为”对话框(1) (13:17).mp4
- 1-49 [WPF记事本开发详解] C++编码:组装Notepad中的“另存为”对话框(2) (06:16).mp4
- 1-50 [WPF记事本开发详解] 代码实现:组装“另存为”对话框(1) (12:19).mp4
- 1-51 [WPF记事本开发详解] 代码实现:组装“另存为”对话框(2) (09:33).mp4
- 1-52 [WPF记事本开发详解] 代码实现:“保存”中的逻辑实现 (15:07).mp4
- 1-53 [WPF记事本开发详解] 代码实现:“新建”与“新窗口”中的逻辑实现(1) (14:31).mp4
- 1-54 [WPF记事本开发详解] 代码实现:“新建”与“新窗口”中的逻辑实现(2) (12:25).mp4
- 1-55 [WPF记事本开发详解] 代码实现:“打开”中的逻辑实现(1) (13:07).mp4
- 1-56 [WPF记事本开发详解] 代码实现:“打开”中的逻辑实现(2) (13:42).mp4
- 1-57 [WPF记事本开发详解] 代码实现:“打开”中的逻辑实现(3) (06:04).mp4
- 1-58 [WPF记事本开发详解] 逆向分析:.NET中的“PageSetupDialog” (16:10).mp4
- 1-59 [WPF记事本开发详解] 逆向分析:Notepad中的“PageSetupDlg” (07:48).mp4
- 1-60 [WPF记事本开发详解] 代码实现:创建“PageSetupDlg”对话框模板(1) (18:17).mp4
- 1-61 [WPF记事本开发详解] 代码实现:创建“PageSetupDlg”对话框模板(2) (12:25).mp4
- 1-62 [WPF记事本开发详解] 软件调试:“PageSetupDlg”对话框模板中的“坑” (18:36).mp4
- 1-63 [WPF记事本开发详解] 软件调试:.NET中“PageSetupDialog”的参数 (14:35).mp4
- 1-64 [WPF记事本开发详解] 软件调试:.NET中“PageSetupDialog”的参数 (07:12).mp4
- 1-65 [WPF记事本开发详解] 代码实现:“PageSetupDialog”中的逻辑实现(1 (11:41).mp4
- 1-66 [WPF记事本开发详解] 代码实现:“PageSetupDialog”中的逻辑实现(2 (12:35).mp4
- 1-67 [WPF记事本开发详解] 代码实现:“PageSetupDialog”中的逻辑实现(3 (09:10).mp4
- 1-68 [WPF记事本开发详解] 代码实现:“打印”PrintDialog中的逻辑实现(1) (10:26).mp4
- 1-69 [WPF记事本开发详解] 代码实现:“打印”PrintDialog中的逻辑实现(2) (11:42).mp4
- 1-70 [WPF记事本开发详解] 代码实现:“打印”PrintDialog中的逻辑实现(3) (16:01).mp4
- 1-71 [WPF记事本开发详解] 代码实现:“打印”PrintDialog中的逻辑实现(4) (10:14).mp4
- 1-72 [WPF记事本开发详解] 代码实现:“退出”中的逻辑实现 (12:11).mp4





