<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>项目 on Zeros遇见的作品集合</title><link>https://zeroszhang.github.io/categories/%E9%A1%B9%E7%9B%AE/</link><description>Recent content in 项目 on Zeros遇见的作品集合</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>Zeros遇见</copyright><lastBuildDate>Fri, 21 Aug 2026 20:10:58 +0800</lastBuildDate><atom:link href="https://zeroszhang.github.io/categories/%E9%A1%B9%E7%9B%AE/index.xml" rel="self" type="application/rss+xml"/><item><title>笔记系统</title><link>https://zeroszhang.github.io/p/%E7%AC%94%E8%AE%B0%E7%B3%BB%E7%BB%9F/</link><pubDate>Fri, 21 Aug 2026 20:10:58 +0800</pubDate><guid>https://zeroszhang.github.io/p/%E7%AC%94%E8%AE%B0%E7%B3%BB%E7%BB%9F/</guid><description>&lt;img src="https://zeroszhang.github.io/p/%E7%AC%94%E8%AE%B0%E7%B3%BB%E7%BB%9F/assets/cover.jpg" alt="Featured image of post 笔记系统" /&gt;&lt;blockquote class="alert alert-important"&gt;&#10; &lt;div class="alert-header"&gt;&#10; &lt;span class="alert-icon"&gt;📌&lt;/span&gt;&#10; &lt;span class="alert-title"&gt;重要&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="alert-body"&gt;&#10; &lt;p&gt;我于2016年参加工作，至今（2026年）已有10年。这期间我成长了很多，其中最大的财富是我的笔记系统。&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;这个文档其实是一个合集文档，我会持续不断的去完善笔记系统，使其更适合我自己使用。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="../%e5%85%b3%e4%ba%8e%e6%80%9d%e8%80%83%e7%9a%84%e5%bf%85%e8%a6%81%e6%80%a7/" &gt;关于思考的必要性&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="../%e5%bb%ba%e7%ab%8b%e7%ac%94%e8%ae%b0%e7%b3%bb%e7%bb%9f/" &gt;建立笔记系统&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="../%e6%88%91%e7%9a%84%e7%ac%94%e8%ae%b0%e7%b3%bb%e7%bb%9f" &gt;我的笔记系统&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>博客系统</title><link>https://zeroszhang.github.io/p/%E5%8D%9A%E5%AE%A2%E7%B3%BB%E7%BB%9F/</link><pubDate>Fri, 21 Aug 2026 20:05:50 +0800</pubDate><guid>https://zeroszhang.github.io/p/%E5%8D%9A%E5%AE%A2%E7%B3%BB%E7%BB%9F/</guid><description>&lt;img src="https://zeroszhang.github.io/p/%E5%8D%9A%E5%AE%A2%E7%B3%BB%E7%BB%9F/assets/cover.jpg" alt="Featured image of post 博客系统" /&gt;&lt;h2 id="2026-年-08-月-21-日"&gt;&lt;a href="#2026-%e5%b9%b4-08-%e6%9c%88-21-%e6%97%a5" class="header-anchor"&gt;&lt;/a&gt;2026 年 08 月 21 日&#10;&lt;/h2&gt;&lt;p&gt;主要更新：虽然表面上什么都没有改变，但是底层已经是完全不一样的架构了。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;使用当前最新的 hugo 版本 0.165，以及最新的 stack 主题版本 4.0.3，对我重要的是支持了 Callout 块。&lt;/li&gt;&#10;&lt;li&gt;优化站点结构，实现了 content 和 themes 的完全分离，可以让我实现迅速的替换主题。&lt;/li&gt;&#10;&lt;li&gt;优化了 github 部署流程。老版本的博客是将 public 文件夹中的内容提交到 github 中，新版本是直接将源码提交到 github，并使用 github action 进行云构建，源码分支 main 和构建分支 gh-pages 完全分离。&lt;/li&gt;&#10;&lt;li&gt;整理了当前的结构，重点分出「随笔」和「项目」分类。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;</description></item><item><title>AI编程下的产物2026年5月</title><link>https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/</link><pubDate>Tue, 19 May 2026 15:26:23 +0800</pubDate><guid>https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/</guid><description>&lt;img src="https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/cover.jpg" alt="Featured image of post AI编程下的产物2026年5月" /&gt;&lt;p&gt;这篇文章记录是，是最近我使用 AI 编程实现的几个软件，用于解决我平时遇到的问题。&lt;/p&gt;&#10;&lt;p&gt;或许你也有过，做一件事情的时候脑子里会思考，有些地方不对，太繁琐了。但是又因为学习成本太高或者精力不足，使得自己很难改变什么。&lt;/p&gt;&#10;&lt;p&gt;在 AI 时代下，我开始意识到 AI 的价值正是帮助实现心里的想法。&lt;/p&gt;&#10;&lt;h2 id="博客发布"&gt;&lt;a href="#%e5%8d%9a%e5%ae%a2%e5%8f%91%e5%b8%83" class="header-anchor"&gt;&lt;/a&gt;博客发布&#10;&lt;/h2&gt;&lt;p&gt;近期由于本地 AI Agent 的爆火，我将我的笔记系统从 wolai 导出到了 Obsidian 中了。粗略的算了一下，自从我 2018 年开始养成记录的习惯后，前后写了 4000 多篇笔记了。&lt;/p&gt;&#10;&lt;p&gt;我的博客是去年才搭建的，但是更新频率并不多。其中一条原因是我将博客视作一个发布界面，并非每条笔记我都要发布出来。另一个很现实的原因是，我使用 hugo 编译静态网站，但是太难用了。&lt;/p&gt;&#10;&lt;p&gt;基于这个原因，我使用 KimiCode 做了一个辅助博客发布的软件。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt=" " class="gallery-image" data-flex-basis="362px" data-flex-grow="151" height="350" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image.png" width="529"&gt;&lt;/p&gt;&#10;&lt;p&gt;这个软件有三个功能：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;新建文章&lt;/li&gt;&#10;&lt;li&gt;本地预览文章&lt;/li&gt;&#10;&lt;li&gt;构建并发布博客&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;希望我能使用这个工具，帮助我增加更新博客的频率。&lt;/p&gt;&#10;&lt;h2 id="每日阅读"&gt;&lt;a href="#%e6%af%8f%e6%97%a5%e9%98%85%e8%af%bb" class="header-anchor"&gt;&lt;/a&gt;每日阅读&#10;&lt;/h2&gt;&lt;p&gt;过去我一直使用 Folo 这个软件，订阅我常看的网站、博客，并且我会在笔记系统中记录我认为有价值的文章，并反复阅读。这就导致了一个问题：有一些过去我没有记录的内容，之后就如泥牛入海，再也找不到了。&lt;/p&gt;&#10;&lt;p&gt;受到最近爆火的卡帕西的知识库的启发，以及最近 Folo 发布了自己 cli，我做了一个脚本，用于将我在 Folo 下的未读文章以 Markdown 的格式保存到本地。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="446px" data-flex-grow="186" height="1032" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-1.png" srcset="https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-1_hu_9ede6ed2544dd991.png 800w, https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-1_hu_2c15e8002130a31d.png 1600w, https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-1.png 1920w" width="1920"&gt;&lt;/p&gt;&#10;&lt;p&gt;简单来说，首先使用 Folo 的 cli 获取未读文章的原始网络地址，然后根据原始网络地址对应的网站保存为本地的 html，最后根据 html 的来源使用不同的策略解析成对应的 markdown 文件。这些步骤我都使用 KimiCode 实现了一个 Python 脚本来运行。&lt;/p&gt;&#10;&lt;p&gt;我会使用 KimiCode 去总结当天的 markdown 文件，告诉这些文章大概讲了什么内容，遇到我感兴趣的内容，再去读原文。最重要的是，做完这些后，我会按天将整个文件夹放在 Obsidian 中进行存档。这样在我后面想起来一篇文章但是找不到时，我就可以让 AI 去这个文件夹下寻找。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="446px" data-flex-grow="186" height="1032" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-2.png" srcset="https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-2_hu_179047ef58c48ca4.png 800w, https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-2_hu_6d1c9dc34e57bcad.png 1600w, https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-2.png 1920w" width="1920"&gt;&lt;/p&gt;&#10;&lt;h2 id="文档翻译"&gt;&lt;a href="#%e6%96%87%e6%a1%a3%e7%bf%bb%e8%af%91" class="header-anchor"&gt;&lt;/a&gt;文档翻译&#10;&lt;/h2&gt;&lt;p&gt;Halcon 我在工作中经常会使用到的软件，功能十分强大，唯一的缺点是，文档和手册都是英文的，看起来太痛苦了。&lt;/p&gt;&#10;&lt;p&gt;之前学习的时候，搭配翻译软件也能看个七七八八，但是过了一段时间之后，记忆会逐渐淡忘。为此我在 wolai 中曾经做过一个汉化的库。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="446px" data-flex-grow="186" height="1032" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-3.png" srcset="https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-3_hu_208f73d0eb505826.png 800w, https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-3_hu_47e2ec00db047f20.png 1600w, https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-3.png 1920w" width="1920"&gt;&lt;/p&gt;&#10;&lt;p&gt;很遗憾的是，后来我意识到这件事太困难，并且效率太低了。&lt;/p&gt;&#10;&lt;p&gt;现在 AI 的大环境下，我使用 ClaudeCode + DeepSeek 实现了 Halcon 本地算子的翻译，并将其放在了 Obsidian 中。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="446px" data-flex-grow="186" height="1032" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-4.png" srcset="https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-4_hu_d96144827b44b9f8.png 800w, https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-4_hu_3bd77321c158f87e.png 1600w, https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-4.png 1920w" width="1920"&gt;&lt;/p&gt;&#10;&lt;p&gt;这样做有两点好处：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;所有的内容都是基于本地的 html 文档翻译过来的，真实性有了保证&lt;/li&gt;&#10;&lt;li&gt;转换成 markdown 之后，对于文档里我认为不足的地方可以直接修改&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;除此以外，为了让我的同事们都可以用上中文的 Halcon 手册，我又回过头来将其编译成了 html。因为我的同事们并不使用 Obsidian，因此直接将 markdown 发给他们，还得下载 Obsidian 并且要保持和我的配置类似。为了简单一点，直接编译成 html，使用浏览器打开更简单一点。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="446px" data-flex-grow="186" height="1032" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-5.png" srcset="https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-5_hu_1e35580306b96d6c.png 800w, https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-5_hu_e2c78429c2b1a8f1.png 1600w, https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-5.png 1920w" width="1920"&gt;&lt;/p&gt;&#10;&lt;h2 id="obsidian-插件"&gt;&lt;a href="#obsidian-%e6%8f%92%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;Obsidian 插件&#10;&lt;/h2&gt;&lt;p&gt;正如我上面所说，我将笔记系统从 wolai 迁移到了 Obsidian 中。&lt;/p&gt;&#10;&lt;p&gt;我好多年前就知道了 Obsidian 这个软件，但是因为其个性化能力太强，需要频繁的折腾和学习，我担心会影响我记笔记的积极性，最终还是选择了开箱即用的 wolai。&lt;/p&gt;&#10;&lt;p&gt;但是在 AI 时代下，wolai 出现了致命缺陷——数据存在服务器上，我没法喂给 AI 使用。在经过了几天的纠结之后，我还是选择了放弃 wolai，使用 Obsidian。&lt;/p&gt;&#10;&lt;p&gt;Obsidian 最强大的地方在于他的插件社区，虽然这也是我当初放弃的原因，因为插件太多了，每一个插件都要去学习，尤其是 Templater、DataView、Button 这几个插件，不但配置复杂，还要去学习 JS 语法。&lt;/p&gt;&#10;&lt;p&gt;但是现在有了 AI，完全不需要去学了。我直接将这些插件的官方文档喂给 AI 做成了 Skill，然后使用这个 Skill 去实现我想要的功能，简单易用，并且自由度很高。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="446px" data-flex-grow="186" height="1032" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-6.png" srcset="https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-6_hu_3dad819043933c36.png 800w, https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-6_hu_9f35241d842e28f8.png 1600w, https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-6.png 1920w" width="1920"&gt;&#10;&lt;img class="gallery-image" data-flex-basis="446px" data-flex-grow="186" height="1032" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-7.png" srcset="https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-7_hu_ba2e9d9ec720d565.png 800w, https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-7_hu_64acaaddc94a8f88.png 1600w, https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-7.png 1920w" width="1920"&gt;&lt;/p&gt;&#10;&lt;h2 id="工作上的小软件"&gt;&lt;a href="#%e5%b7%a5%e4%bd%9c%e4%b8%8a%e7%9a%84%e5%b0%8f%e8%bd%af%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;工作上的小软件&#10;&lt;/h2&gt;&lt;p&gt;AI 在我工作上的帮助就更多了，也正是由于很多，所以这几只能挑几个进行说明。&lt;/p&gt;&#10;&lt;p&gt;我使用 AI 优化了 ZerosSVN 软件，现在这个软件使用更简单了，一键即可实现同步、提交、冲突解决等所有步骤。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="358px" data-flex-grow="149" height="793" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-8.png" srcset="https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-8_hu_409c0ab23f32bf62.png 800w, https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-8.png 1186w" width="1186"&gt;&#10;我用 AI 做了一个线扫描的仿真软件，加载对应的产品模型，就可以获得线扫描数据。这可以帮助我在测试软件时，提供一些数据。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="361px" data-flex-grow="150" height="932" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-9.png" srcset="https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-9_hu_badc8f4370c0f849.png 800w, https://zeroszhang.github.io/p/ai%E7%BC%96%E7%A8%8B%E4%B8%8B%E7%9A%84%E4%BA%A7%E7%89%A92026%E5%B9%B45%E6%9C%88/assets/image-9.png 1402w" width="1402"&gt;&lt;/p&gt;&#10;&lt;h2 id="总结"&gt;&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;总结&#10;&lt;/h2&gt;&lt;p&gt;这几个软件没有一个是需要大量的学习才能做出来的，全都是我遇到了实际问题，然后去思考该如何解决问题，最后使用 AI 大约几个小时就能做出来。&lt;/p&gt;&#10;&lt;p&gt;我一直认为自己不是一个顶尖的程序员，但我始终认为自己是一个很好的产品经理。&lt;/p&gt;&#10;&lt;p&gt;AI 使得我的 90% 技能，价值变为 0，但使得剩下的 10% 技能，价值增长了 1000 倍。每个人在 AI 面前，都需要重新调整自己的技能。&lt;/p&gt;&#10;</description></item><item><title>建立笔记系统</title><link>https://zeroszhang.github.io/p/%E5%BB%BA%E7%AB%8B%E7%AC%94%E8%AE%B0%E7%B3%BB%E7%BB%9F/</link><pubDate>Mon, 30 Mar 2026 16:17:46 +0800</pubDate><guid>https://zeroszhang.github.io/p/%E5%BB%BA%E7%AB%8B%E7%AC%94%E8%AE%B0%E7%B3%BB%E7%BB%9F/</guid><description>&lt;img src="https://zeroszhang.github.io/p/%E5%BB%BA%E7%AB%8B%E7%AC%94%E8%AE%B0%E7%B3%BB%E7%BB%9F/assets/cover.jpg" alt="Featured image of post 建立笔记系统" /&gt;&lt;h2 id="工作遇到的困难"&gt;&lt;a href="#%e5%b7%a5%e4%bd%9c%e9%81%87%e5%88%b0%e7%9a%84%e5%9b%b0%e9%9a%be" class="header-anchor"&gt;&lt;/a&gt;工作遇到的困难&#10;&lt;/h2&gt;&lt;p&gt;十年的工作中，我感受最深的就是「时间碎片化」——碎片化的时间给我带来的是似曾相识的无力感。我明明解决过这个问题，但是却一遍遍的重新踩坑。我的工作经验没有积累成资产，而是像沙子一样，每次努力抓一把，但是随着时间的流逝，最后都从指缝溜走。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;- 我曾经看着代码抛出一个我清晰记得碰到过的异常，但是死活想不起来之前是如何解决的&#10;- 我曾经被老板问到这个版本的软件有哪些改进，而我却没法给出在调试时的对比&#10;- 我曾经看着自己上周自己没写完的代码，但是完全不知道自己接下来要做什么&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;那一刻我深刻的意识到：我需要一套系统，让我的经验可以保存、可以检索、可以迭代。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="377px" data-flex-grow="157" height="543" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/%E5%BB%BA%E7%AB%8B%E7%AC%94%E8%AE%B0%E7%B3%BB%E7%BB%9F/assets/PixPin_2026-03-30_12-52-20_FHpDJB1JEk.png" srcset="https://zeroszhang.github.io/p/%E5%BB%BA%E7%AB%8B%E7%AC%94%E8%AE%B0%E7%B3%BB%E7%BB%9F/assets/PixPin_2026-03-30_12-52-20_FHpDJB1JEk_hu_90ae7192b238d68f.png 800w, https://zeroszhang.github.io/p/%E5%BB%BA%E7%AB%8B%E7%AC%94%E8%AE%B0%E7%B3%BB%E7%BB%9F/assets/PixPin_2026-03-30_12-52-20_FHpDJB1JEk.png 853w" width="853"&gt;&lt;/p&gt;&#10;&lt;h2 id="笔记系统的功能"&gt;&lt;a href="#%e7%ac%94%e8%ae%b0%e7%b3%bb%e7%bb%9f%e7%9a%84%e5%8a%9f%e8%83%bd" class="header-anchor"&gt;&lt;/a&gt;笔记系统的功能&#10;&lt;/h2&gt;&lt;p&gt;那么我到底需要一套什么样的系统来帮助自己？首先我需要明确自己的需求：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;- 记录自己做过的工作&#10;- 记录学习过的知识&#10;- 记录自己曾经犯过的错误和解决方案&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;这些需求总的来说就是「记录和总结」。高中时期经常听老师念叨一句话——“好记性不如烂笔头”，那时候抄写老师上课的板书，会将自己的理解当作评价写在边上，这就是一种笔记系统。&lt;/p&gt;&#10;&lt;h2 id="建立笔记系统的原则"&gt;&lt;a href="#%e5%bb%ba%e7%ab%8b%e7%ac%94%e8%ae%b0%e7%b3%bb%e7%bb%9f%e7%9a%84%e5%8e%9f%e5%88%99" class="header-anchor"&gt;&lt;/a&gt;建立笔记系统的原则&#10;&lt;/h2&gt;&lt;p&gt;笔记系统必须同时包含「输入和输出」，输入是你记录的内容，输出是你对内容的总结。&lt;/p&gt;&#10;&lt;p&gt;一个好的笔记系统，必须遵循这三个原则——存得住、找得着、用得上。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;- 存得住：确保有价值的的信息不会丢失；否则会依赖记忆力，非常容易出错&#10;- 找得到：当你需要的时候可以快速定位；否则会有信息黑洞，越记录越焦虑&#10;- 用得上：去掉没用的内容，只保留核心；否则需要花时间重新学习总结&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h2 id="笔记系统的误区"&gt;&lt;a href="#%e7%ac%94%e8%ae%b0%e7%b3%bb%e7%bb%9f%e7%9a%84%e8%af%af%e5%8c%ba" class="header-anchor"&gt;&lt;/a&gt;笔记系统的误区&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;🍡 笔记系统不是收藏夹、素材库&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;这种错误表现为使用剪藏插件疯狂收藏，但是从来不打开。会导致需要的时候找不到，找到了不过是把曾经看过的东西再看一遍。保存≠学会，收藏是输入，学会是输出。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;🌝 笔记系统不是复制粘贴&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;这种错误表现为笔记里大段的原文，没有自己的思考，复制别人的模板，但是从未具体问题具体分析。这是一种拿来主义，所有的经验必须自己去实践才可以获得。近期这种错误表现为使用AI总结内容。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;🎞️ 笔记系统不是博客&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;这种错误表现为花了大量的时间美化排版、配色。博客热衷于表达，而非使用。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;📄 不要陷入完美主义&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;这种错误表现为对一篇笔记反复修改，每个笔记都要标签齐全，链接完善，记录的内容也要尽善尽美。记笔记不是编写一本书，笔记本身就是零碎的。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;🩺 不要陷入工具主义&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;这种错误表现为频繁更换笔记软件，经常比较不同软件的高级技巧，但是却使用不好基础功能。不要把搭建系统本身当作目标，搭建系统只是服务工作的手段。&lt;/p&gt;&#10;&lt;h2 id="如何用好笔记系统"&gt;&lt;a href="#%e5%a6%82%e4%bd%95%e7%94%a8%e5%a5%bd%e7%ac%94%e8%ae%b0%e7%b3%bb%e7%bb%9f" class="header-anchor"&gt;&lt;/a&gt;如何用好笔记系统&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;🦚 养成随时记录的习惯&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;灵感一闪而过，如果不能立马记录，可能转头就忘。我想表达的重点是「养成记录的习惯」，而不是去追求一键记录。这种记录方式可以只写一句话，一个关键字，不用追求完美记录，等后续再进行整理。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;🔔 要对笔记进行分类&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;笔记分类是为了可预测的定位路径，在需要的时候知道去哪里找。分类只需要分几个大类就行，没必要非常细化。虽然搜索功能可以很方便的定位，但是你仍然需要知道笔记大概在哪里。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;🍊 经常翻看自己的笔记&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;笔记的价值在于复用，定期回顾才能持续迭代。所谓温故而知新，在不同的时间看同一篇笔记会产生不同的感悟。审视过去的自己，也是一种成长。&lt;/p&gt;&#10;&lt;h2 id="我的实践"&gt;&lt;a href="#%e6%88%91%e7%9a%84%e5%ae%9e%e8%b7%b5" class="header-anchor"&gt;&lt;/a&gt;我的实践&#10;&lt;/h2&gt;&lt;p&gt;接下来我将基于上面的原则，讲述我的笔记系统实践。&lt;/p&gt;&#10;&lt;h3 id="-我使用的软件wolai"&gt;&lt;a href="#-%e6%88%91%e4%bd%bf%e7%94%a8%e7%9a%84%e8%bd%af%e4%bb%b6wolai" class="header-anchor"&gt;&lt;/a&gt;🥘 我使用的软件——wolai&#10;&lt;/h3&gt;&lt;p&gt;我使用wolai来记录笔记，有以下几个理由：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;支持斜杠命令、Markdown标记&lt;/li&gt;&#10;&lt;li&gt;笔记之间相互链接的功能做的比较方便&lt;/li&gt;&#10;&lt;li&gt;支持Latex数学公式截图识别&lt;/li&gt;&#10;&lt;li&gt;笔记存在云端，不用折腾同步功能，支持导出&lt;/li&gt;&#10;&lt;li&gt;被阿里巴巴收购了，不太可能随时暴毙&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;当然这个软件也有一些缺点：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;2021年曾经出过一件事，软件团队检测用户笔记内容，对敏感或擦边的内容进行和谐处理。这也是所有云笔记的缺点，但是我个人没有类似的烦恼。&lt;/li&gt;&#10;&lt;li&gt;几乎没有可以自定义的功能，作为一个笔记软件竟然没法修改字体！&lt;/li&gt;&#10;&lt;li&gt;2025年下半年开始更新频率显著降低，几乎没有新功能出来了。&lt;/li&gt;&#10;&lt;li&gt;绘图功能做的不好，只提供了思维导图，绘制流程图要么使用&lt;code&gt;Mermaid&lt;/code&gt;要么在&lt;code&gt;draw.io&lt;/code&gt;画完之后截图粘贴——&lt;code&gt;Mermaid&lt;/code&gt;不好调整，&lt;code&gt;draw.io&lt;/code&gt;截图不好修改。绘图方面做的最好的是飞书文档。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;市面上的一些其他软件我也有试用过，这里就讲讲我不选他们的理由：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;notion&lt;/code&gt;：可以说&lt;code&gt;wolai&lt;/code&gt;是仿照&lt;code&gt;notion&lt;/code&gt;实现的软件，&lt;code&gt;notion&lt;/code&gt;在功能上比&lt;code&gt;wolai&lt;/code&gt;强大很多。我最终没有选择&lt;code&gt;notion&lt;/code&gt;主要有两个原因——网络问题和本地化问题。网络问题不多说，网上很多人讲。本地化问题是我认为&lt;code&gt;wolai&lt;/code&gt;做的比较好的方面，比如&lt;code&gt;/dmpd&lt;/code&gt;输入代码片段，&lt;code&gt;/hngs&lt;/code&gt;输入行内公式，实际上输入&lt;code&gt;/dm&lt;/code&gt;和&lt;code&gt;/hn&lt;/code&gt;就可以了，我还是更习惯使用拼音首字母。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;obsidian&lt;/code&gt;：社区插件丰富，个性化程度高。笔记本地化存储，数据安全。我没有选择&lt;code&gt;obsidian&lt;/code&gt;的原因也正是由于这两个特点：第一是个性化程度太高了，太折腾了，会引诱我不断去折腾插件。第二是手机端的问题，&lt;code&gt;obsidian&lt;/code&gt;手机端做的没有&lt;code&gt;wolai&lt;/code&gt;好用&lt;/li&gt;&#10;&lt;li&gt;飞书：飞书文档是作为一个功能模块放在飞书里面的，除了文档功能飞书的其他功能也很好用，我们公司就使用飞书办公。飞书的文档不能导出为&lt;code&gt;markdown&lt;/code&gt;格式，只能导出为&lt;code&gt;word&lt;/code&gt;格式，有浏览器插件提供导出&lt;code&gt;markdown&lt;/code&gt;的功能。最核心的一点是如果我要更换笔记软件，我必须一篇一篇的导出，不能做到全部导出，而&lt;code&gt;wolai&lt;/code&gt;提供了这个功能，虽然这功能做的一般。&lt;/li&gt;&#10;&lt;li&gt;语雀：语雀也是阿里系的笔记软件，我也不知道为什么阿里要整这么多笔记软件。语雀更适合用来作为博客，而不是用来做笔记。语雀的文档系统和飞书一样都是知识库，也不能全部导出。另外语雀和飞书的笔记链接的功能做的都没有&lt;code&gt;wolai&lt;/code&gt;好，可能知识库的定位就是用来展示的。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;我还使用过印象笔记，思源笔记，有道云文档，logseq，Typora，VSCode，OneNote，为知笔记，trilium等，太多了也没法全部点评。总之，正如我上面提过的，记笔记的目的是服务于生活，而不是建立系统。各位读者可以自行试用或者看网上一些笔记软件的评测，选择合适自己的笔记软件。千万千万千万要记得不要陷入工具主义陷阱。&lt;/p&gt;&#10;&lt;h3 id="-我如何实践存得住"&gt;&lt;a href="#-%e6%88%91%e5%a6%82%e4%bd%95%e5%ae%9e%e8%b7%b5%e5%ad%98%e5%be%97%e4%bd%8f" class="header-anchor"&gt;&lt;/a&gt;🍠 我如何实践「存得住」？&#10;&lt;/h3&gt;&lt;p&gt;一般来说我都会在「临时缓存」中进行记录零碎的想法和整理笔记，整理完后放到「主题记录」中对应的页面中。所以「临时缓存」对我来说就是笔记的入口，所以在这个页面，我做了以下工作：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;创建一个「待办事项」页面，任何笔记中我认为没有完成的部分都会引用这个页面，这样我进入到这个页面，就能看到自己给自己留下的任务&lt;/li&gt;&#10;&lt;li&gt;创建一个「反复阅读」页面，任何我认为近期需要复习的内容，都会在这个页面添加引用。&lt;/li&gt;&#10;&lt;li&gt;创建一个「自动按钮」用于快速的添加页面，简化我的记录操作。&lt;/li&gt;&#10;&lt;li&gt;创建一个以月份命名的页面，用于写日志。这个页面会以流水账的形式记录工作事项，主要是为了记录自己过去一段时间做了什么，这样可以督促自己思考。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="398px" data-flex-grow="166" height="910" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/%E5%BB%BA%E7%AB%8B%E7%AC%94%E8%AE%B0%E7%B3%BB%E7%BB%9F/assets/PixPin_2026-03-30_15-55-57_LCV80XNPS6.png" srcset="https://zeroszhang.github.io/p/%E5%BB%BA%E7%AB%8B%E7%AC%94%E8%AE%B0%E7%B3%BB%E7%BB%9F/assets/PixPin_2026-03-30_15-55-57_LCV80XNPS6_hu_a832d5d582b8a813.png 800w, https://zeroszhang.github.io/p/%E5%BB%BA%E7%AB%8B%E7%AC%94%E8%AE%B0%E7%B3%BB%E7%BB%9F/assets/PixPin_2026-03-30_15-55-57_LCV80XNPS6.png 1512w" width="1512"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;wolai&lt;/code&gt;还提供一个微信小程序，给微信小程序发送链接或者文字，就会转存到固定的页面中，我设置了「临时缓存」。&lt;/p&gt;&#10;&lt;p&gt;我习惯使用单一入口记笔记，而不是在对应的页面记笔记。一方面是为了更快速的记录，另一方面也是为了可以看到自己有哪些还没有整理过的笔记。所有的一切都是为了「记得住」。&lt;/p&gt;&#10;&lt;h3 id="-我如何实践找得到"&gt;&lt;a href="#-%e6%88%91%e5%a6%82%e4%bd%95%e5%ae%9e%e8%b7%b5%e6%89%be%e5%be%97%e5%88%b0" class="header-anchor"&gt;&lt;/a&gt;🍉 我如何实践「找得到」？&#10;&lt;/h3&gt;&lt;p&gt;我并没有采用常见的如PARA、卡片、数字编码、标签等分类方法，我是完全按照我自己的使用习惯进行分类的，这也是我说的一定要自己去实践，不要直接使用别人的模板，模板只是作为一个参考。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="364px" data-flex-grow="151" height="176" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/%E5%BB%BA%E7%AB%8B%E7%AC%94%E8%AE%B0%E7%B3%BB%E7%BB%9F/assets/PixPin_2026-03-30_14-59-55_HTFIMWyqRU.png" width="267"&gt;&lt;/p&gt;&#10;&lt;p&gt;我的笔记主要分了四个大类：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;临时缓存：这个页面提供的是收集箱的功能，我平时在网上看到的好的文档，临时的想法，随手的记录都会丢到这个里面去，然后有时间就整理。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="302px" data-flex-grow="125" height="833" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/%E5%BB%BA%E7%AB%8B%E7%AC%94%E8%AE%B0%E7%B3%BB%E7%BB%9F/assets/PixPin_2026-03-30_15-05-42_hN7bDo_MKO.png" srcset="https://zeroszhang.github.io/p/%E5%BB%BA%E7%AB%8B%E7%AC%94%E8%AE%B0%E7%B3%BB%E7%BB%9F/assets/PixPin_2026-03-30_15-05-42_hN7bDo_MKO_hu_6518ab1e495ff4d1.png 800w, https://zeroszhang.github.io/p/%E5%BB%BA%E7%AB%8B%E7%AC%94%E8%AE%B0%E7%B3%BB%E7%BB%9F/assets/PixPin_2026-03-30_15-05-42_hN7bDo_MKO.png 1049w" width="1049"&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;时光记录：这个页面提供日记的功能，里面的文档以日期为标题，仅用来记录我生活中的一些经历，感悟等。我希望等我老了的时候回看自己的日记，会发出当初我竟然还这样想过的感叹。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="421px" data-flex-grow="175" height="920" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/%E5%BB%BA%E7%AB%8B%E7%AC%94%E8%AE%B0%E7%B3%BB%E7%BB%9F/assets/PixPin_2026-03-30_15-06-28_BaGHzD5GMw.png" srcset="https://zeroszhang.github.io/p/%E5%BB%BA%E7%AB%8B%E7%AC%94%E8%AE%B0%E7%B3%BB%E7%BB%9F/assets/PixPin_2026-03-30_15-06-28_BaGHzD5GMw_hu_c93fdeba411f4dad.png 800w, https://zeroszhang.github.io/p/%E5%BB%BA%E7%AB%8B%E7%AC%94%E8%AE%B0%E7%B3%BB%E7%BB%9F/assets/PixPin_2026-03-30_15-06-28_BaGHzD5GMw_hu_fca0301ccd89b0e7.png 1600w, https://zeroszhang.github.io/p/%E5%BB%BA%E7%AB%8B%E7%AC%94%E8%AE%B0%E7%B3%BB%E7%BB%9F/assets/PixPin_2026-03-30_15-06-28_BaGHzD5GMw.png 1614w" width="1614"&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;主题记录：这个页面是笔记的核心页面，可以说这个才是笔记系统的核心内容。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="384px" data-flex-grow="160" height="905" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/%E5%BB%BA%E7%AB%8B%E7%AC%94%E8%AE%B0%E7%B3%BB%E7%BB%9F/assets/PixPin_2026-03-30_15-07-53_41ZEbfUMo5.png" srcset="https://zeroszhang.github.io/p/%E5%BB%BA%E7%AB%8B%E7%AC%94%E8%AE%B0%E7%B3%BB%E7%BB%9F/assets/PixPin_2026-03-30_15-07-53_41ZEbfUMo5_hu_675b5fece6390c10.png 800w, https://zeroszhang.github.io/p/%E5%BB%BA%E7%AB%8B%E7%AC%94%E8%AE%B0%E7%B3%BB%E7%BB%9F/assets/PixPin_2026-03-30_15-07-53_41ZEbfUMo5.png 1448w" width="1448"&gt;&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;- 「备忘录」：记录我自己和我爸妈的账号密码，记录家里的宽带账号密码，记录房屋租赁的收入与花销，记录汽车保险信息，医疗保险信息等生活信息&#10;- 「零碎知识」：记录我在互联网上学到的一些知识，内部包含三个模块——what、how、why。这个页面里的内容使用频率不高，只是为了增加自己的知识面。&#10;- 「阅读记录」：包含书籍阅读笔记、博客阅读笔记和其他文章阅读笔记&#10;- 「电子数码」：比如机械硬盘的原理、固态硬盘的原理、路由器和交换机的区别、常用的CPU&#10;- 「软件」：我是一个很喜欢尝试新软件的人，所以我单独给了一个页面用于记录自己曾经用过的软件，比如这个软件是做什么的，有什么优点，什么缺点。&#10;- 「游戏」：我会记录一些游戏的攻略，比如泰拉瑞亚的流程，星露谷mod的安装等内容&#10;- 「教育相关」：去年年底有了自己的孩子，于是平时看到的一些教育相关的内容，都会放到这个里面&#10;- 「自动化」：我本人从事自动化设备行业，这个页面记录的是工作中的内容，比如相机如何选型，某某品牌的运动控制卡如何操作，GRR的计算方式，半导体先进封装工艺等&#10;- 「编程知识」：记录和编程有关的知识，比如Python开发，Vue开发，Andriod开发，OpenCV的使用，红黑树和二叉树的区别等&#10;- 「CSharp语言」：我的工作主要是使用C#语言，因此单独给了一个页面，记录Winform和WPF相关的知识，功能案例，优化技巧、异常处理等&#10;- 「数学推导」：包含编程中使用到的数学知识，比如直线拟合、三维旋转、射线与包围盒相交检测等&#10;- 「AI」：最近AI很火，所以单独开了一个页面记录相关的内容&#10;- 「公司管理」：包含如何跟同事沟通、如何解决团队分歧、招聘时关心的问题等内容&#10;- 「成长」：会记录可以提升自己思维的内容，比如工具祛媚，创作还是消费，效率成瘾等，我希望自己可以成为更好的人。&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;笔记分类其实没有统一的格式，我没有模板分类的原因是因为，我认为他们都太全面的，而我不可能做到那么全面。我只需要把我生活工作中的重要内容单独提取出来即可。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;「归档」：这个页面会存放剪藏的文章，我正在考虑是不是要将其删除，因为在阅读后我已经将内容总结到我的笔记中了。这些原来的剪藏内容，我不但再也没有看过，反而会增加我搜索的难度。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="-我如何实践用得上"&gt;&lt;a href="#-%e6%88%91%e5%a6%82%e4%bd%95%e5%ae%9e%e8%b7%b5%e7%94%a8%e5%be%97%e4%b8%8a" class="header-anchor"&gt;&lt;/a&gt;🥑 我如何实践「用得上」？&#10;&lt;/h3&gt;&lt;p&gt;在笔记的编写上，我也一些习惯可以分享。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;明确的命名。比如我在一些页面明确what-why-how，以让我快速知道这个笔记里的内容。&lt;/li&gt;&#10;&lt;li&gt;尽量少的标题层级，我一般只会使用二级标题和三级标题。标题层级如果太复杂，会让笔记显得很乱。&lt;/li&gt;&#10;&lt;li&gt;持续迭代笔记，相同主题的笔记合并为一个，相关主题的笔记相互链接。&lt;/li&gt;&#10;&lt;li&gt;在保证内容清晰的前提下，使内容尽可能简短。你的笔记不需要给别人看，因此你要记录关键信息，让自己看得懂就行。&lt;/li&gt;&#10;&lt;li&gt;尽量自己手动记笔记，AI只提供辅助。只有自己记录的内容才会记忆深刻，AI总结然后复制粘贴后的内容很容易忘记。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="总结"&gt;&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;总结&#10;&lt;/h2&gt;&lt;p&gt;这篇文章写到这里，还是有很多细节没有提到。我原本应该添加更多的截图，以展示我是如何做的，但是转念一想，又觉得似乎我给出的经验，也是一种模板。我的模板对别人可能并没有什么用，只要保持上文提到的三个原则——存得住、找得到、用得上，都是适合自己的笔记系统。&lt;/p&gt;&#10;</description></item><item><title>ZerosSVN项目助手</title><link>https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/</link><pubDate>Wed, 18 Jun 2025 17:17:04 +0800</pubDate><guid>https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/</guid><description>&lt;img src="https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/cover.jpg" alt="Featured image of post ZerosSVN项目助手" /&gt;&lt;h2 id="碰到的问题"&gt;&lt;a href="#%e7%a2%b0%e5%88%b0%e7%9a%84%e9%97%ae%e9%a2%98" class="header-anchor"&gt;&lt;/a&gt;碰到的问题&#10;&lt;/h2&gt;&lt;p&gt;随着公司项目越来越多，在项目的维护方面，我们碰到了如下问题：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;多人参与同一个项目，文件相互不同步，需要频繁的使用公共盘共享文件&lt;/li&gt;&#10;&lt;li&gt;每个人都有各自对于项目文件的命名方式和存放方式，在员工离职后找不到对应的项目文件&lt;/li&gt;&#10;&lt;li&gt;同一个项目在每个电脑上存在不同的版本，想找到对应的版本存在困难&lt;/li&gt;&#10;&lt;li&gt;员工的电脑不存在备份机制，如果硬盘坏了，则项目文件会丢失&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="解决方案"&gt;&lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="header-anchor"&gt;&lt;/a&gt;解决方案&#10;&lt;/h2&gt;&lt;p&gt;基于上面的问题点，需要实现如下的功能：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;同一项目的命名方式和文档结构&lt;/li&gt;&#10;&lt;li&gt;合并不同员工之间的文件，统一管理，支持同步&lt;/li&gt;&#10;&lt;li&gt;项目文件的版本管理和备份&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;我大概的思路是使用 SubVersion 软件进行管理。在服务端，我在公司的服务器上安装了 VirsualSVN，作为 SVN 的服务器。社区版，白嫖的。&lt;/p&gt;&#10;&lt;blockquote class="alert alert-tip"&gt;&#10; &lt;div class="alert-header"&gt;&#10; &lt;span class="alert-icon"&gt;💡&lt;/span&gt;&#10; &lt;span class="alert-title"&gt;提示&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="alert-body"&gt;&#10; &lt;p&gt;SubVersion(SVN) 是一款开源的版本控制系统，用于管理文件和目录的变更历史。&#10;和 Git 不同，SVN 使用中心式的文件管理，依赖于服务器，恰好完全满足我的需求。&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="397px" data-flex-grow="165" height="834" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/PixPin_2025-06-18_17-30-04.png" srcset="https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/PixPin_2025-06-18_17-30-04_hu_8a714a6a9fa617cd.png 800w, https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/PixPin_2025-06-18_17-30-04.png 1382w" width="1382"&gt;&lt;/p&gt;&#10;&lt;p&gt;在客户端的选择上，我首先尝试了 TortoiseSVN，功能确实可以满足，但是相对来说，命令行的操作有点复杂，非程序员学习起来还是需要成本。最严重的一个问题点在于，在 Windows 11 下，TortoiseSVN 的右键菜单项折叠在子菜单里，使用起来很不方便。&lt;/p&gt;&#10;&lt;blockquote class="alert alert-note"&gt;&#10; &lt;div class="alert-header"&gt;&#10; &lt;span class="alert-icon"&gt;📝&lt;/span&gt;&#10; &lt;span class="alert-title"&gt;备注&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="alert-body"&gt;&#10; &lt;p&gt;右键菜单的问题后来我使用 &lt;code&gt;Nilesoft Shell&lt;/code&gt; 解决了。参考 &lt;a class="link" href="../%e8%bd%af%e4%bb%b6%e6%8e%a8%e8%8d%90" &gt;软件推荐&lt;/a&gt;&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;基于上述的问题和考虑，我打算自己实现一个没有学习成本，操作比较简单的项目助手软件。SVN 相关的操作我使用开源的 SharpSVN 库，这个库没有文档，只有代码内的 xml 助手。&lt;/p&gt;&#10;&lt;h2 id="实现思路"&gt;&lt;a href="#%e5%ae%9e%e7%8e%b0%e6%80%9d%e8%b7%af" class="header-anchor"&gt;&lt;/a&gt;实现思路&#10;&lt;/h2&gt;&lt;p&gt;我和公司的小伙伴们一起整理了目前所有的项目资料，合并到一个文件夹中。并且在 SVN 中创建一个共同的仓库来管理这些文件夹。每个项目修改为 &lt;code&gt;年份_客户_项目名&lt;/code&gt; 的方式进行命名。如下所示：&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="705px" data-flex-grow="294" height="185" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/image-20250618173940074.png" width="544"&gt;&lt;/p&gt;&#10;&lt;blockquote class="alert alert-note"&gt;&#10; &lt;div class="alert-header"&gt;&#10; &lt;span class="alert-icon"&gt;📝&lt;/span&gt;&#10; &lt;span class="alert-title"&gt;备注&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="alert-body"&gt;&#10; &lt;p&gt;并非每个项目一个 SVN 仓库，主要是为了好管理，不需要每次新增项目都要我去操作服务器。即使只想同步某几个项目文件夹，也完全可以使用 SVN 的部分同步机制实现。&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;软件的界面大致如下所示：&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="341px" data-flex-grow="142" height="693" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/image-20250618174136938.png" srcset="https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/image-20250618174136938_hu_54c1824840ae56b6.png 800w, https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/image-20250618174136938.png 986w" width="986"&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;提供了 SVN 的 Update，Commit 等主要功能，支持项目子文件夹的同步&lt;/li&gt;&#10;&lt;li&gt;提供了登录账号，可以在 VirsualSVN 中设置不同账号的权限&lt;/li&gt;&#10;&lt;li&gt;提供软件在局域网内的检查更新的功能&lt;/li&gt;&#10;&lt;li&gt;提供搜索和排序的功能&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="更新记录"&gt;&lt;a href="#%e6%9b%b4%e6%96%b0%e8%ae%b0%e5%bd%95" class="header-anchor"&gt;&lt;/a&gt;更新记录&#10;&lt;/h2&gt;&lt;h3 id="2025-年-08-月-21-日"&gt;&lt;a href="#2025-%e5%b9%b4-08-%e6%9c%88-21-%e6%97%a5" class="header-anchor"&gt;&lt;/a&gt;2025 年 08 月 21 日&#10;&lt;/h3&gt;&lt;p&gt;对整个页面结构进行了重新设计，并且实现了对文件冲突的初步管理。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="361px" data-flex-grow="150" height="815" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/PixPin_2026-08-21_21-09-16.png" srcset="https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/PixPin_2026-08-21_21-09-16_hu_42a6f237ce89e621.png 800w, https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/PixPin_2026-08-21_21-09-16.png 1226w" width="1226"&gt;&#10;&lt;img class="gallery-image" data-flex-basis="361px" data-flex-grow="150" height="815" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/PixPin_2026-08-21_21-10-49.png" srcset="https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/PixPin_2026-08-21_21-10-49_hu_ea66be221a27c363.png 800w, https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/PixPin_2026-08-21_21-10-49.png 1226w" width="1226"&gt;&lt;/p&gt;&#10;&lt;h3 id="2026-年-05-月-14日"&gt;&lt;a href="#2026-%e5%b9%b4-05-%e6%9c%88-14%e6%97%a5" class="header-anchor"&gt;&lt;/a&gt;2026 年 05 月 14日&#10;&lt;/h3&gt;&lt;p&gt;本次针对界面内容进行优化：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;软件默认「仅显示已同步」，即用户关注和自己相关的项目即可。&lt;/li&gt;&#10;&lt;li&gt;进一步简化操作逻辑，三个按钮还是太多了，同事们在使用软件的经常未同步就提交，导致文件冲突。「提交」按钮对应的是 Sync 的逻辑，包含了「Update」和「Commit」，是一套完整的同步逻辑，「刷新」和「同步」按钮归类到「更多」中去。&lt;/li&gt;&#10;&lt;li&gt;在 Obsidian 中整理了一下整个项目，距离上一次更新太久了，导致我都看不懂自己写的代码了。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="361px" data-flex-grow="150" height="815" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/PixPin_2026-08-21_21-12-08.png" srcset="https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/PixPin_2026-08-21_21-12-08_hu_80abb308f1b0259b.png 800w, https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/PixPin_2026-08-21_21-12-08.png 1226w" width="1226"&gt;&#10;&lt;img class="gallery-image" data-flex-basis="361px" data-flex-grow="150" height="815" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/PixPin_2026-08-21_21-19-44.png" srcset="https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/PixPin_2026-08-21_21-19-44_hu_48d4540d42d8f3fa.png 800w, https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/PixPin_2026-08-21_21-19-44.png 1226w" width="1226"&gt;&lt;/p&gt;&#10;&lt;h3 id="2026-年-05-月-19日"&gt;&lt;a href="#2026-%e5%b9%b4-05-%e6%9c%88-19%e6%97%a5" class="header-anchor"&gt;&lt;/a&gt;2026 年 05 月 19日&#10;&lt;/h3&gt;&lt;p&gt;基于同事的强烈要求，新增了更新日志提示，并给软件增加了帮助文档。这么做的目的是为了让同事们知道每次更新的内容是什么。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="361px" data-flex-grow="150" height="815" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/PixPin_2026-08-21_21-15-37.png" srcset="https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/PixPin_2026-08-21_21-15-37_hu_1c9dfa224b1c91cd.png 800w, https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/PixPin_2026-08-21_21-15-37.png 1226w" width="1226"&gt;&#10;&lt;img class="gallery-image" data-flex-basis="361px" data-flex-grow="150" height="815" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/PixPin_2026-08-21_21-17-02.png" srcset="https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/PixPin_2026-08-21_21-17-02_hu_9eaf62043bd1b6b9.png 800w, https://zeroszhang.github.io/p/zerossvn%E9%A1%B9%E7%9B%AE%E5%8A%A9%E6%89%8B/assets/PixPin_2026-08-21_21-17-02.png 1226w" width="1226"&gt;&lt;/p&gt;&#10;</description></item><item><title>Halcon手册</title><link>https://zeroszhang.github.io/p/halcon%E6%89%8B%E5%86%8C/</link><pubDate>Thu, 20 Feb 2025 15:55:19 +0800</pubDate><guid>https://zeroszhang.github.io/p/halcon%E6%89%8B%E5%86%8C/</guid><description>&lt;img src="https://zeroszhang.github.io/p/halcon%E6%89%8B%E5%86%8C/assets/cover.jpg" alt="Featured image of post Halcon手册" /&gt;&lt;p&gt;最近发现 Halcon 的官方手册写得很好，于是详细阅读并做笔记。&lt;/p&gt;&#10;&lt;p&gt;在我的笔记系统中包含以下文档的中文翻译：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Solution Guide I.pdf&lt;/li&gt;&#10;&lt;li&gt;Solution Guide II-A.pdf&lt;/li&gt;&#10;&lt;li&gt;Solution Guide II-B.pdf&lt;/li&gt;&#10;&lt;li&gt;Solution Guide II-C.pdf&lt;/li&gt;&#10;&lt;li&gt;Solution Guide II-D.pdf&lt;/li&gt;&#10;&lt;li&gt;Solution Guide III-A.pdf&lt;/li&gt;&#10;&lt;li&gt;Solution Guide III-B.pdf&lt;/li&gt;&#10;&lt;li&gt;Solution Guide III-C.pdf&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;文档中的案例都做了详细的笔记：&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="399px" data-flex-grow="166" height="875" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/halcon%E6%89%8B%E5%86%8C/assets/PixPin_2025-02-20_15-54-07-1748076912939-3.png" srcset="https://zeroszhang.github.io/p/halcon%E6%89%8B%E5%86%8C/assets/PixPin_2025-02-20_15-54-07-1748076912939-3_hu_37f7db6162706369.png 800w, https://zeroszhang.github.io/p/halcon%E6%89%8B%E5%86%8C/assets/PixPin_2025-02-20_15-54-07-1748076912939-3.png 1458w" width="1458"&gt;&lt;/p&gt;&#10;&lt;p&gt;部分例程学习后整理上传到此处：&lt;a class="link" href="https://gitee.com/Zeros_Zhang/HalconExample" target="_blank" rel="noopener"&#10; &gt;Halcon 例程&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;2026年05月21日更新：我拿AI给整个Halcon的本地算子文档翻译了一遍，现在我的笔记中又增加了完整的、可编辑的算子手册。参考 &lt;a class="link" href="../AI%e7%bc%96%e7%a8%8b%e4%b8%8b%e7%9a%84%e4%ba%a7%e7%89%a92026%e5%b9%b45%e6%9c%88" &gt;AI编程下的产物2026年5月&lt;/a&gt;。&lt;/p&gt;&#10;</description></item><item><title>Microsoft Rewards 自动获取助手</title><link>https://zeroszhang.github.io/p/microsoft-rewards-%E8%87%AA%E5%8A%A8%E8%8E%B7%E5%8F%96%E5%8A%A9%E6%89%8B/</link><pubDate>Thu, 06 Feb 2025 15:44:39 +0800</pubDate><guid>https://zeroszhang.github.io/p/microsoft-rewards-%E8%87%AA%E5%8A%A8%E8%8E%B7%E5%8F%96%E5%8A%A9%E6%89%8B/</guid><description>&lt;img src="https://zeroszhang.github.io/p/microsoft-rewards-%E8%87%AA%E5%8A%A8%E8%8E%B7%E5%8F%96%E5%8A%A9%E6%89%8B/assets/cover.jpg" alt="Featured image of post Microsoft Rewards 自动获取助手" /&gt;&lt;h2 id="关于-microsoft-rewards"&gt;&lt;a href="#%e5%85%b3%e4%ba%8e-microsoft-rewards" class="header-anchor"&gt;&lt;/a&gt;关于 Microsoft Rewards&#10;&lt;/h2&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1160px" data-flex-grow="483" height="324" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/microsoft-rewards-%E8%87%AA%E5%8A%A8%E8%8E%B7%E5%8F%96%E5%8A%A9%E6%89%8B/assets/ZMicrosoftRewards-1748076929110-5.png" srcset="https://zeroszhang.github.io/p/microsoft-rewards-%E8%87%AA%E5%8A%A8%E8%8E%B7%E5%8F%96%E5%8A%A9%E6%89%8B/assets/ZMicrosoftRewards-1748076929110-5_hu_4c6bed78cc61cbf0.png 800w, https://zeroszhang.github.io/p/microsoft-rewards-%E8%87%AA%E5%8A%A8%E8%8E%B7%E5%8F%96%E5%8A%A9%E6%89%8B/assets/ZMicrosoftRewards-1748076929110-5.png 1567w" width="1567"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;Microsoft Rewards&lt;/code&gt; 是微软出品的一款软件，可以通过搜索 &lt;code&gt;Bing&lt;/code&gt; 来获取奖励，奖励的种类有很多，包括现金、积分、礼品等。但是我老是忘记搜索 &lt;code&gt;Bing&lt;/code&gt;，因此就实现了一个软件，帮助我每天自动搜索 &lt;code&gt;Bing&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;我并没有将该功能添加到 &lt;code&gt;ZerosTodo&lt;/code&gt; 中，因为我并不希望该功能影响我正常使用电脑，所以我拿了一个老笔记本安装了 &lt;code&gt;Windows Server 2016&lt;/code&gt;，当作我的服务器。&lt;/p&gt;&#10;&lt;p&gt;另外，&lt;code&gt;Rewards&lt;/code&gt; 也有手机端的搜索任务，但是手机我是随身带着，所以我并没有实现安卓端的软件，直接使用油猴脚本进行替代。&lt;/p&gt;&#10;&lt;p&gt;项目代码上传到此处：&lt;a class="link" href="https://gitee.com/Zeros_Zhang/rewards-auto-mate" target="_blank" rel="noopener"&#10; &gt;RewardsAutoMate&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="功能说明"&gt;&lt;a href="#%e5%8a%9f%e8%83%bd%e8%af%b4%e6%98%8e" class="header-anchor"&gt;&lt;/a&gt;功能说明&#10;&lt;/h2&gt;&lt;h3 id="自动搜索功能"&gt;&lt;a href="#%e8%87%aa%e5%8a%a8%e6%90%9c%e7%b4%a2%e5%8a%9f%e8%83%bd" class="header-anchor"&gt;&lt;/a&gt;自动搜索功能&#10;&lt;/h3&gt;&lt;p&gt;该软件用于在 PC 端获取随机的搜索关键词，自动搜索 &lt;code&gt;Bing&lt;/code&gt;，每天搜索 40 次，每隔 12 个小时执行一次任务。如果当天已经完成了任务，则不会继续执行。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="261px" data-flex-grow="108" height="785" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/microsoft-rewards-%E8%87%AA%E5%8A%A8%E8%8E%B7%E5%8F%96%E5%8A%A9%E6%89%8B/assets/ZAutoSearch-1748076929110-6.png" srcset="https://zeroszhang.github.io/p/microsoft-rewards-%E8%87%AA%E5%8A%A8%E8%8E%B7%E5%8F%96%E5%8A%A9%E6%89%8B/assets/ZAutoSearch-1748076929110-6_hu_849a17a66e1658ce.png 800w, https://zeroszhang.github.io/p/microsoft-rewards-%E8%87%AA%E5%8A%A8%E8%8E%B7%E5%8F%96%E5%8A%A9%E6%89%8B/assets/ZAutoSearch-1748076929110-6.png 855w" width="855"&gt;&lt;/p&gt;&#10;&lt;h3 id="热力图功能"&gt;&lt;a href="#%e7%83%ad%e5%8a%9b%e5%9b%be%e5%8a%9f%e8%83%bd" class="header-anchor"&gt;&lt;/a&gt;热力图功能&#10;&lt;/h3&gt;&lt;p&gt;为了记录每天的搜索情况，该软件会生成如 &lt;code&gt;Github&lt;/code&gt; 的热力图，用于记录每天的搜索情况。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="该图片使用随机数据" class="gallery-image" data-flex-basis="570px" data-flex-grow="237" height="635" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/microsoft-rewards-%E8%87%AA%E5%8A%A8%E8%8E%B7%E5%8F%96%E5%8A%A9%E6%89%8B/assets/ZHeatMap-1748076929110-7.png" srcset="https://zeroszhang.github.io/p/microsoft-rewards-%E8%87%AA%E5%8A%A8%E8%8E%B7%E5%8F%96%E5%8A%A9%E6%89%8B/assets/ZHeatMap-1748076929110-7_hu_5aaaf802eba0afc4.png 800w, https://zeroszhang.github.io/p/microsoft-rewards-%E8%87%AA%E5%8A%A8%E8%8E%B7%E5%8F%96%E5%8A%A9%E6%89%8B/assets/ZHeatMap-1748076929110-7.png 1510w" width="1510"&gt;&lt;/p&gt;&#10;&lt;h3 id="自动登录功能"&gt;&lt;a href="#%e8%87%aa%e5%8a%a8%e7%99%bb%e5%bd%95%e5%8a%9f%e8%83%bd" class="header-anchor"&gt;&lt;/a&gt;自动登录功能&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Rewards&lt;/code&gt; 和微软账号相关，所以在打开 &lt;code&gt;EdgeDriver&lt;/code&gt; 时，要调用本地的账户信息进行登录。&lt;/p&gt;&#10;&lt;h2 id="更新记录"&gt;&lt;a href="#%e6%9b%b4%e6%96%b0%e8%ae%b0%e5%bd%95" class="header-anchor"&gt;&lt;/a&gt;更新记录&#10;&lt;/h2&gt;&lt;h3 id="2025年04月18日"&gt;&lt;a href="#2025%e5%b9%b404%e6%9c%8818%e6%97%a5" class="header-anchor"&gt;&lt;/a&gt;2025年04月18日&#10;&lt;/h3&gt;&lt;p&gt;通过 &lt;code&gt;UserAgent&lt;/code&gt; 伪装成移动设备，这样可以在电脑端模拟移动端的搜索。&lt;/p&gt;&#10;&lt;h3 id="2025年06月13日"&gt;&lt;a href="#2025%e5%b9%b406%e6%9c%8813%e6%97%a5" class="header-anchor"&gt;&lt;/a&gt;2025年06月13日&#10;&lt;/h3&gt;&lt;p&gt;Edge老是在后台自动更新，导致我时不时的要同步更新 drive 的版本，我换成 Chrome 了。&lt;/p&gt;&#10;&lt;h3 id="2025年10月26日"&gt;&lt;a href="#2025%e5%b9%b410%e6%9c%8826%e6%97%a5" class="header-anchor"&gt;&lt;/a&gt;2025年10月26日&#10;&lt;/h3&gt;&lt;p&gt;🥲我决定关闭这个项目，这奖励太蚊子腿了，抽奖也是完全抽不中的说。&lt;/p&gt;&#10;&lt;h3 id="2026年06月08日"&gt;&lt;a href="#2026%e5%b9%b406%e6%9c%8808%e6%97%a5" class="header-anchor"&gt;&lt;/a&gt;2026年06月08日&#10;&lt;/h3&gt;&lt;p&gt;用 AI 重新写了整个项目，反正不是什么特别重要的项目，代码质量无所谓了。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="453px" data-flex-grow="188" height="792" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/microsoft-rewards-%E8%87%AA%E5%8A%A8%E8%8E%B7%E5%8F%96%E5%8A%A9%E6%89%8B/assets/PixPin_2026-08-21_21-29-00.png" srcset="https://zeroszhang.github.io/p/microsoft-rewards-%E8%87%AA%E5%8A%A8%E8%8E%B7%E5%8F%96%E5%8A%A9%E6%89%8B/assets/PixPin_2026-08-21_21-29-00_hu_a7803036bd5992b3.png 800w, https://zeroszhang.github.io/p/microsoft-rewards-%E8%87%AA%E5%8A%A8%E8%8E%B7%E5%8F%96%E5%8A%A9%E6%89%8B/assets/PixPin_2026-08-21_21-29-00.png 1496w" width="1496"&gt;&lt;/p&gt;&#10;</description></item><item><title>ZerosTodo 个人助手</title><link>https://zeroszhang.github.io/p/zerostodo-%E4%B8%AA%E4%BA%BA%E5%8A%A9%E6%89%8B/</link><pubDate>Fri, 17 Jan 2025 16:39:45 +0800</pubDate><guid>https://zeroszhang.github.io/p/zerostodo-%E4%B8%AA%E4%BA%BA%E5%8A%A9%E6%89%8B/</guid><description>&lt;img src="https://zeroszhang.github.io/p/zerostodo-%E4%B8%AA%E4%BA%BA%E5%8A%A9%E6%89%8B/assets/cover.jpg" alt="Featured image of post ZerosTodo 个人助手" /&gt;&lt;h2 id="碰到的问题"&gt;&lt;a href="#%e7%a2%b0%e5%88%b0%e7%9a%84%e9%97%ae%e9%a2%98" class="header-anchor"&gt;&lt;/a&gt;碰到的问题&#10;&lt;/h2&gt;&lt;p&gt;在日常的工作中，碰到几个问题：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;经常忘记个别要做的事情&lt;/li&gt;&#10;&lt;li&gt;某个事情做完几天后，忘记了当时的情况&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;因此就实现了一个软件 &lt;code&gt;ZerosTodo&lt;/code&gt; ，帮助我日常更方便的工作。之前也使用过例如滴答清单、微软Todo、时光序等软件，与这些不同的是，&lt;code&gt;ZerosTodo&lt;/code&gt; 的数据都存放在 wolai 这个笔记软件中，并通过 api 实现交互功能。&lt;/p&gt;&#10;&lt;p&gt;项目代码上传到此处：&lt;a class="link" href="https://gitee.com/Zeros_Zhang/ZerosTodo" target="_blank" rel="noopener"&#10; &gt;ZerosTodo&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="399px" data-flex-grow="166" height="548" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/zerostodo-%E4%B8%AA%E4%BA%BA%E5%8A%A9%E6%89%8B/assets/ZerosTodo-1748076960651-43.png" srcset="https://zeroszhang.github.io/p/zerostodo-%E4%B8%AA%E4%BA%BA%E5%8A%A9%E6%89%8B/assets/ZerosTodo-1748076960651-43_hu_adf401a7e1825232.png 800w, https://zeroszhang.github.io/p/zerostodo-%E4%B8%AA%E4%BA%BA%E5%8A%A9%E6%89%8B/assets/ZerosTodo-1748076960651-43.png 913w" width="913"&gt;&lt;/p&gt;&#10;&lt;h2 id="更新记录"&gt;&lt;a href="#%e6%9b%b4%e6%96%b0%e8%ae%b0%e5%bd%95" class="header-anchor"&gt;&lt;/a&gt;更新记录&#10;&lt;/h2&gt;&lt;h3 id="2025-年-02-月-06-日"&gt;&lt;a href="#2025-%e5%b9%b4-02-%e6%9c%88-06-%e6%97%a5" class="header-anchor"&gt;&lt;/a&gt;2025 年 02 月 06 日&#10;&lt;/h3&gt;&lt;p&gt;这个软件目前包含两个功能：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;从 &lt;code&gt;wolai&lt;/code&gt; 的特定页面中获取最近要做的几个事情&lt;/li&gt;&#10;&lt;li&gt;每隔 5 秒截图屏幕并保存&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;对于需求 1，为了区别于正常的待办软件，我的软件里并没有待办的概念，而是直接把最近要做的几个事情显示在软件的界面上，并置顶悬浮于所有软件上面。我在屏幕专门留了一个角落给他。&lt;/p&gt;&#10;&lt;p&gt;对于需求 2，我遍历当前所有的屏幕，并对每个屏幕截图，按照日期保存到指定的文件夹中。同时，为了避免硬盘占用太多，额外新增了一个配置项，超过 90 天的文件夹将会被删除。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="457px" data-flex-grow="190" height="411" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/zerostodo-%E4%B8%AA%E4%BA%BA%E5%8A%A9%E6%89%8B/assets/ZerosTodoWolai-1748076960651-46.png" width="784"&gt;&#10;&lt;img class="gallery-image" data-flex-basis="457px" data-flex-grow="190" height="411" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/zerostodo-%E4%B8%AA%E4%BA%BA%E5%8A%A9%E6%89%8B/assets/ZerosTodoLog-1748076960651-44.png" width="784"&gt;&lt;/p&gt;&#10;&lt;h3 id="2025-年-03-月-18-日"&gt;&lt;a href="#2025-%e5%b9%b4-03-%e6%9c%88-18-%e6%97%a5" class="header-anchor"&gt;&lt;/a&gt;2025 年 03 月 18 日&#10;&lt;/h3&gt;&lt;p&gt;新增文字朗读的功能，优化 UI 界面。这个功能可以上传 txt 文件，并调用 Windows 的语音包朗读内容。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="425px" data-flex-grow="177" height="443" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/zerostodo-%E4%B8%AA%E4%BA%BA%E5%8A%A9%E6%89%8B/assets/PixPin_2025-04-18_17-40-58-1748076960651-45.png" width="786"&gt;&lt;/p&gt;&#10;&lt;h3 id="2025-年-05-月-26-日"&gt;&lt;a href="#2025-%e5%b9%b4-05-%e6%9c%88-26-%e6%97%a5" class="header-anchor"&gt;&lt;/a&gt;2025 年 05 月 26 日&#10;&lt;/h3&gt;&lt;p&gt;新增朗读剪贴板文字的功能。在常驻窗口中增加了一个小按钮，复制文本后点一下按钮，就可以调用系统朗读功能。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="246px" data-flex-grow="102" height="267" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/zerostodo-%E4%B8%AA%E4%BA%BA%E5%8A%A9%E6%89%8B/assets/PixPin_2025-05-26_17-41-08.png" width="274"&gt;&lt;/p&gt;&#10;&lt;h3 id="2025-年-06-月-09-日"&gt;&lt;a href="#2025-%e5%b9%b4-06-%e6%9c%88-09-%e6%97%a5" class="header-anchor"&gt;&lt;/a&gt;2025 年 06 月 09 日&#10;&lt;/h3&gt;&lt;p&gt;新增了一个临时记事本功能，可以拖拽任意内容到悬浮窗口添加内容，也可以直接在悬浮窗口按下 Ctrl+V 添加剪贴板内容。临时记事本会在鼠标离开后的 3 秒自动关闭。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="349px" data-flex-grow="145" height="596" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/zerostodo-%E4%B8%AA%E4%BA%BA%E5%8A%A9%E6%89%8B/assets/2025%E5%B9%B46%E6%9C%889%E6%97%A5.png" srcset="https://zeroszhang.github.io/p/zerostodo-%E4%B8%AA%E4%BA%BA%E5%8A%A9%E6%89%8B/assets/2025%E5%B9%B46%E6%9C%889%E6%97%A5_hu_b3cc8d3aa9aa41fe.png 800w, https://zeroszhang.github.io/p/zerostodo-%E4%B8%AA%E4%BA%BA%E5%8A%A9%E6%89%8B/assets/2025%E5%B9%B46%E6%9C%889%E6%97%A5.png 869w" width="869"&gt;&lt;/p&gt;&#10;&lt;h3 id="2025-年-08-月-21日"&gt;&lt;a href="#2025-%e5%b9%b4-08-%e6%9c%88-21%e6%97%a5" class="header-anchor"&gt;&lt;/a&gt;2025 年 08 月 21日&#10;&lt;/h3&gt;&lt;p&gt;这个软件短时间内应该不会再更新了，在实际使用的过程中我发现软件对我的帮助微乎其微。需求是真实的需求，但是软件没有解决这些痛点。&lt;/p&gt;&#10;&lt;h3 id="2026-年-06-月-03-日"&gt;&lt;a href="#2026-%e5%b9%b4-06-%e6%9c%88-03-%e6%97%a5" class="header-anchor"&gt;&lt;/a&gt;2026 年 06 月 03 日&#10;&lt;/h3&gt;&lt;p&gt;我将笔记软件从 wolai 更换到了 obsidian，在此过程中我一直在思考如何优化笔记系统。上述的需求我已经通过 obsidian 的侧边栏插件实现，参考 Sidebar Home。&lt;/p&gt;&#10;</description></item><item><title>BaseWPFControl</title><link>https://zeroszhang.github.io/p/basewpfcontrol/</link><pubDate>Fri, 17 Jan 2025 11:25:07 +0800</pubDate><guid>https://zeroszhang.github.io/p/basewpfcontrol/</guid><description>&lt;img src="https://zeroszhang.github.io/p/basewpfcontrol/assets/cover.jpg" alt="Featured image of post BaseWPFControl" /&gt;&lt;h2 id="简介"&gt;&lt;a href="#%e7%ae%80%e4%bb%8b" class="header-anchor"&gt;&lt;/a&gt;简介&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;BaseWPFControl&lt;/code&gt; 是一个 &lt;code&gt;dll&lt;/code&gt;，基于 &lt;code&gt;.net 8.0&lt;/code&gt; 和 &lt;code&gt;WPF&lt;/code&gt; 框架实现，用于提供控件样式（包含基础控件和额外控件）。&lt;/p&gt;&#10;&lt;h2 id="基础控件"&gt;&lt;a href="#%e5%9f%ba%e7%a1%80%e6%8e%a7%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;基础控件&#10;&lt;/h2&gt;&lt;h3 id="button"&gt;&lt;a href="#button" class="header-anchor"&gt;&lt;/a&gt;Button&#10;&lt;/h3&gt;&lt;p&gt;重写了基础控件 &lt;code&gt;Button&lt;/code&gt; 的样式。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;新增 &lt;code&gt;BaseWPFControl:ButtonProperty.Icon&lt;/code&gt; 附加属性用于提供按钮图标&lt;/li&gt;&#10;&lt;li&gt;提供圆角&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;Button&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;纯文字按钮&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;Button&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;图标&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;BaseWPFControl:ButtonProperty.Icon=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{StaticResource HomePage}&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;Button&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;圆形按钮&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;Style=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{StaticResource CircleButtonStyle}&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;Button&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;带图标的圆形按钮&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;Style=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{StaticResource CircleButtonStyle}&amp;#34;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;BaseWPFControl:ButtonProperty.Icon=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{StaticResource HomePage}&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;Button&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;跑道形按钮&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;Style=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{StaticResource RoundButtonStyle}&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;Button&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;图标&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;Style=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{StaticResource RoundButtonStyle}&amp;#34;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;BaseWPFControl:ButtonProperty.Icon=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{StaticResource HomePage}&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="2671px" data-flex-grow="1113" height="61" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/%E6%99%AE%E9%80%9A%E6%8C%89%E9%92%AE-1748076976389-59.png" width="679"&gt;&lt;/p&gt;&#10;&lt;p&gt;针对不启用和不可点击的按钮，做出了区分，分别对应 &lt;code&gt;IsEnabled&lt;/code&gt; 和 &lt;code&gt;IsHitTestVisible&lt;/code&gt; 属性。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;Button&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;不启用&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsEnabled=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;Button&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;不可点击&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsHitTestVisible=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1308px" data-flex-grow="545" height="51" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/Button%E5%8C%BA%E5%88%86%E4%B8%8D%E5%90%AF%E7%94%A8%E5%92%8C%E4%B8%8D%E5%8F%AF%E7%82%B9%E5%87%BB-1748076976389-60.png" width="278"&gt;&lt;/p&gt;&#10;&lt;p&gt;之所以这样去做目的是为了 &lt;code&gt;GPIO&lt;/code&gt; 的控制，&lt;code&gt;GPI&lt;/code&gt; 不可点击，&lt;code&gt;GPO&lt;/code&gt; 可点击。&lt;/p&gt;&#10;&lt;p&gt;提供了两种相似的样式 &lt;code&gt;BooleanStateButtonStyle&lt;/code&gt; 和 &lt;code&gt;BooleanToggleButtonStyle&lt;/code&gt;。前者对应于 &lt;code&gt;GPI&lt;/code&gt;，不可点击，仅用于展示 &lt;code&gt;GPI&lt;/code&gt; 状态，后者对应于 &lt;code&gt;GPO&lt;/code&gt;，既可以展示 &lt;code&gt;GPO&lt;/code&gt; 状态，又可以通过点击切换状态。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;Button&lt;/span&gt; &lt;span class="na"&gt;Style=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{StaticResource BooleanStateButtonStyle}&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;Tag=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{Binding State}&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;Button&lt;/span&gt; &lt;span class="na"&gt;Style=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{StaticResource BooleanToggleButtonStyle}&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;Tag=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{Binding State}&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Command=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{Binding ChangeStateCommand}&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="519px" data-flex-grow="216" height="55" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/ButtonStateToggle%E5%85%B3%E9%97%AD-1748076976389-61.png" width="119"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="519px" data-flex-grow="216" height="55" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/ButtonStateToggle%E5%BC%80%E5%90%AF-1748076976389-64.png" width="119"&gt;&lt;/p&gt;&#10;&lt;h3 id="togglebutton"&gt;&lt;a href="#togglebutton" class="header-anchor"&gt;&lt;/a&gt;ToggleButton&#10;&lt;/h3&gt;&lt;p&gt;基于 &lt;code&gt;ToggleButton&lt;/code&gt; 重写样式，该控件的本意是用于 &lt;code&gt;GPIO&lt;/code&gt; 的控制&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;ToggleButton&lt;/span&gt; &lt;span class="na"&gt;IsChecked=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{Binding State}&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;ToggleButton&lt;/span&gt; &lt;span class="na"&gt;IsChecked=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{Binding State}&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsEnabled=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="933px" data-flex-grow="389" height="55" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/ToggleButton%E5%85%B3%E9%97%AD-1748076976389-62.png" width="214"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="933px" data-flex-grow="389" height="55" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/ToggleButton%E5%BC%80%E5%90%AF-1748076976389-63.png" width="214"&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;最终方案如下：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;GPI&lt;/code&gt; 使用 &lt;code&gt;Button&lt;/code&gt; 的 &lt;code&gt;BooleanStateButtonStyle&lt;/code&gt; 样式&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;GPO&lt;/code&gt; 使用 &lt;code&gt;ToggleButton&lt;/code&gt; 的默认样式。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="radiobutton"&gt;&lt;a href="#radiobutton" class="header-anchor"&gt;&lt;/a&gt;RadioButton&#10;&lt;/h3&gt;&lt;p&gt;重写 RadioButton 的样式，主要优化如下：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;勾选后样式变化&lt;/li&gt;&#10;&lt;li&gt;勾选框尺寸跟随字体尺寸变化&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;RadioButton&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;未勾选&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;RadioButton&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;勾选&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsChecked=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;RadioButton&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;未勾选未启用&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsEnabled=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsChecked=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;RadioButton&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;勾选未启用&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsEnabled=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsChecked=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;RadioButton&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;大字体&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;30&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="3229px" data-flex-grow="1345" height="44" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/RadioButton-1748076976389-65.png" width="592"&gt;&lt;/p&gt;&#10;&lt;h3 id="checkbox"&gt;&lt;a href="#checkbox" class="header-anchor"&gt;&lt;/a&gt;CheckBox&#10;&lt;/h3&gt;&lt;p&gt;重写 CheckBox 的样式，主要优化如下：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;勾选后样式变化&lt;/li&gt;&#10;&lt;li&gt;勾选框圆角&lt;/li&gt;&#10;&lt;li&gt;勾选框尺寸跟随字体尺寸变化&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;CheckBox&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;未勾选&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;CheckBox&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;勾选&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsChecked=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;CheckBox&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;未勾选未启用&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsEnabled=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsChecked=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;CheckBox&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;勾选未启用&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsEnabled=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsChecked=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;CheckBox&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;大字体&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;30&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="3229px" data-flex-grow="1345" height="44" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/CheckBox-1748076976389-68.png" width="592"&gt;&lt;/p&gt;&#10;&lt;h3 id="combobox"&gt;&lt;a href="#combobox" class="header-anchor"&gt;&lt;/a&gt;ComboBox&#10;&lt;/h3&gt;&lt;p&gt;重写 ComboBox 样式，主要优化如下：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;圆角属性&lt;/li&gt;&#10;&lt;li&gt;提供 ComboBox 绑定枚举值的扩展语法 EnumBindingSource&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--示例1：ComboBox绑定枚举值--&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;ComboBox&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;120&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;ItemsSource=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{BaseWPFControl:EnumBindingSource &#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; EnumType=BaseTest:EnumDayOfWeek}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;SelectedItem=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{Binding SelectedEnumDayOfWeek}&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;ComboBox.ItemTemplate&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;DataTemplate&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;TextBlock&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{Binding &#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; Converter={StaticResource EnumToDescriptionConverter}, &#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; Mode=OneWay}&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/DataTemplate&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/ComboBox.ItemTemplate&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/ComboBox&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--示例2：不启用ComboBox--&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;ComboBox&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;120&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsEnabled=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;ComboBoxItem&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsSelected=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/ComboBox&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--示例3：ComboBox绑定字典--&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--note：需要设置 DisplayMemberPath 和 SelectedValuePath，--&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--note：并只能使用 SelectedValue 进行访问--&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;ComboBox&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;120&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;ItemsSource=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{Binding DictionaryDayOfWeek}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;DisplayMemberPath=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Value&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;SelectedValuePath=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Key&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;SelectedValue=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{Binding SelectedDictionaryDayOfWeek}&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--示例4：ComboBox绑定列表--&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--note：使用 SelectedItem 或者 SelectedValue 都可以获得正确结果--&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--note: 前提是绑定的值在列表中，也可以通过 SelectedIndex 进行访问--&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;ComboBox&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;120&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;ItemsSource=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{Binding ListDayOfWeek}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;SelectedItem=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{Binding SelectedListDayOfWeek}&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="523px" data-flex-grow="218" height="262" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/ComboBox-1748076976389-66.png" width="572"&gt;&lt;/p&gt;&#10;&lt;h3 id="textblock"&gt;&lt;a href="#textblock" class="header-anchor"&gt;&lt;/a&gt;TextBlock&#10;&lt;/h3&gt;&lt;p&gt;重写 &lt;code&gt;TextBlock&lt;/code&gt; 的样式，主要优化如下：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;中英文使用不同的字体显示，中文使用&lt;code&gt;微软雅黑&lt;/code&gt;，英文使用&lt;code&gt;Consolas&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;TextBlock&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;显示中文&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;TextBlock&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Show English&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1661px" data-flex-grow="692" height="38" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/TextBlock-1748076976389-69.png" width="263"&gt;&lt;/p&gt;&#10;&lt;h3 id="memoryblock"&gt;&lt;a href="#memoryblock" class="header-anchor"&gt;&lt;/a&gt;MemoryBlock&#10;&lt;/h3&gt;&lt;p&gt;该控件为自定义控件，主要实现以下功能：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;获取当前软件已使用内存，以 &lt;code&gt;MB&lt;/code&gt; 为单位&lt;/li&gt;&#10;&lt;li&gt;可以通过控件的 &lt;code&gt;Interval&lt;/code&gt; 属性设置更新频率，单位为 &lt;code&gt;ms&lt;/code&gt;，默认为 &lt;code&gt;1000 ms&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;可以通过控件的 &lt;code&gt;Header&lt;/code&gt; 属性设置前缀文字&lt;/li&gt;&#10;&lt;li&gt;可以通过控件的 &lt;code&gt;UsedMemory&lt;/code&gt; 只读属性获取内存&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;BaseWPFControl:MemoryBlock&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1661px" data-flex-grow="692" height="38" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/MemoryBlock-1748076976389-67.png" width="263"&gt;&lt;/p&gt;&#10;&lt;h3 id="logblock"&gt;&lt;a href="#logblock" class="header-anchor"&gt;&lt;/a&gt;LogBlock&#10;&lt;/h3&gt;&lt;p&gt;该控件为自定义控件，配合 &lt;code&gt;BaseLogManager&lt;/code&gt; 一起使用，主要实现以下功能：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;显示日志&lt;/li&gt;&#10;&lt;li&gt;提供日志详情页&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;BaseWPFControl:LogBlock&lt;/span&gt; &lt;span class="na"&gt;x:Name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;LogBlock_Test&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;ContentControl&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;400&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{Binding ElementName=LogBlock_Test, Path=LogView}&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="547px" data-flex-grow="228" height="485" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/LogBlock-1748076976389-70.png" srcset="https://zeroszhang.github.io/p/basewpfcontrol/assets/LogBlock-1748076976389-70_hu_8d012bd3629f1646.png 800w, https://zeroszhang.github.io/p/basewpfcontrol/assets/LogBlock-1748076976389-70.png 1106w" width="1106"&gt;&lt;/p&gt;&#10;&lt;h3 id="textbox"&gt;&lt;a href="#textbox" class="header-anchor"&gt;&lt;/a&gt;TextBox&#10;&lt;/h3&gt;&lt;p&gt;重写 &lt;code&gt;TextBox&lt;/code&gt; 的样式，主要实现以下功能：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;可以通过 &lt;code&gt;TextBoxProperty.Prefix&lt;/code&gt; 属性设置前缀文字&lt;/li&gt;&#10;&lt;li&gt;可以通过 &lt;code&gt;TextBoxProperty.WaterMask&lt;/code&gt; 属性设置水印文字&lt;/li&gt;&#10;&lt;li&gt;可以通过 &lt;code&gt;TextBoxProperty.Suffix&lt;/code&gt; 属性设置后缀文字&lt;/li&gt;&#10;&lt;li&gt;输入时边框高亮显示&lt;/li&gt;&#10;&lt;li&gt;大文本输入框可以通过滚动条上下滚动&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;TextBox&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;200&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;BaseWPFControl:TextBoxProperty.Prefix=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;www.&amp;#34;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;BaseWPFControl:TextBoxProperty.Suffix=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.com&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;BaseWPFControl:TextBoxProperty.WaterMask=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;输入网址&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;TextBox&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;160&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;默认文本框&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;TextBox&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;100&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;BaseWPFControl:TextBoxProperty.WaterMask=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;绑定Decimal类型&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{Binding DecimalNumber, StringFormat=0.#}&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;TextBox&lt;/span&gt; &lt;span class="na"&gt;Style=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{StaticResource BigTextBox}&amp;#34;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;400&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;100&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{Binding Poetry1}&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="2227px" data-flex-grow="928" height="57" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/TextBox-1748076976389-75.png" width="529"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="860px" data-flex-grow="358" height="116" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/BitTextBox-1748076976389-71.png" width="416"&gt;&lt;/p&gt;&#10;&lt;h3 id="numericbox"&gt;&lt;a href="#numericbox" class="header-anchor"&gt;&lt;/a&gt;NumericBox&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;NumericBox&lt;/code&gt; 为自定义控件，主要实现以下功能：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;更方便的绑定数字，并提供限制&lt;/li&gt;&#10;&lt;li&gt;可以通过 &lt;code&gt;Value&lt;/code&gt; 属性获取/设置值&lt;/li&gt;&#10;&lt;li&gt;可以通过 &lt;code&gt;TextFormat&lt;/code&gt; 属性设置文本格式&lt;/li&gt;&#10;&lt;li&gt;可以通过 &lt;code&gt;MinValue&lt;/code&gt; 属性设置最小值&lt;/li&gt;&#10;&lt;li&gt;可以通过 &lt;code&gt;MaxValue&lt;/code&gt; 属性设置最大值&lt;/li&gt;&#10;&lt;li&gt;可以通过 &lt;code&gt;Interval&lt;/code&gt; 属性设置点击增减按钮时的变化量&lt;/li&gt;&#10;&lt;li&gt;可以通过 &lt;code&gt;ValueChanged&lt;/code&gt; 事件获取值改变事件&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;BaseWPFControl:NumericBox&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{Binding DecimalNumber}&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;TextFormat=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0.#&amp;#34;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;MinValue =&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;0&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;MaxValue =&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;100&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Interval =&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;ValueChanged=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;NumericBox_ValueChanged&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;BaseWPFControl:NumericBox&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{Binding DecimalNumber}&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;TextFormat=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0.#&amp;#34;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;IsEnabled=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1498px" data-flex-grow="624" height="53" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/NumericBox-1748076976389-72.png" width="331"&gt;&lt;/p&gt;&#10;&lt;h3 id="passwordbox"&gt;&lt;a href="#passwordbox" class="header-anchor"&gt;&lt;/a&gt;PasswordBox&#10;&lt;/h3&gt;&lt;p&gt;重写 &lt;code&gt;PasswordBox&lt;/code&gt; 样式，主要实现以下功能：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;可以通过 &lt;code&gt;PasswordBoxProperty.CanShowPassword&lt;/code&gt; 属性设置是否显示密码的功能&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;PasswordBox&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;200&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Password=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;123456&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;PasswordBox&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;200&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Password=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;123456&amp;#34;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;BaseWPFControl:PasswordBoxProperty.CanShowPassword=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1946px" data-flex-grow="810" height="55" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/PasswordBox-1748076976389-73.png" width="446"&gt;&lt;/p&gt;&#10;&lt;h3 id="datepicker--datetimepicker"&gt;&lt;a href="#datepicker--datetimepicker" class="header-anchor"&gt;&lt;/a&gt;DatePicker &amp;amp; DateTimePicker&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;DatePicker&lt;/code&gt; 和 &lt;code&gt;DateTimePicker&lt;/code&gt; 都是自定义控件，主要实现以下功能：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;选择时间和日期，这两个控件的区别在于一个前者只有日期，后者包含时间&lt;/li&gt;&#10;&lt;li&gt;可以通过 &lt;code&gt;SelectedDateTime&lt;/code&gt; 获取选中的日期时间&lt;/li&gt;&#10;&lt;li&gt;可以通过 &lt;code&gt;SelectedDateTimeFormat&lt;/code&gt; 设置日期时间的格式&lt;/li&gt;&#10;&lt;li&gt;可以通过 &lt;code&gt;SelectedDateTimeChanged&lt;/code&gt; 获取时间改变的事件&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;BaseWPFControl:DatePicker&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;BaseWPFControl:DateTimePicker&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="402px" data-flex-grow="167" height="317" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/DateTimePicker-1748076976389-74.png" width="532"&gt;&lt;/p&gt;&#10;&lt;h3 id="selectfileblock--selectfolderblock"&gt;&lt;a href="#selectfileblock--selectfolderblock" class="header-anchor"&gt;&lt;/a&gt;SelectFileBlock &amp;amp; SelectFolderBlock&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;SelectFileBlock&lt;/code&gt; 和 &lt;code&gt;SelectFolderBlock&lt;/code&gt; 都是自定义控件，主要实现以下功能：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;点击按钮通过对话框选择文件或者文件夹&lt;/li&gt;&#10;&lt;li&gt;可以通过 &lt;code&gt;SelectedPath&lt;/code&gt; 属性获取/设置路径&lt;/li&gt;&#10;&lt;li&gt;可以通过 &lt;code&gt;SelectedPathChanged&lt;/code&gt; 获取选中路径改变的事件&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;SelectFileBlock&lt;/code&gt; 可以通过 &lt;code&gt;ExtensionFilter&lt;/code&gt; 属性设置文件过滤&lt;/li&gt;&#10;&lt;li&gt;鼠标移动到文字上方出现 &lt;code&gt;ToolTip&lt;/code&gt; 显示路径的全文&lt;/li&gt;&#10;&lt;li&gt;鼠标双击文字直接跳转到路径所在的文件夹&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="2368px" data-flex-grow="987" height="54" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/SelectFileBlock-1748076976389-76.png" width="533"&gt;&lt;/p&gt;&#10;&lt;h3 id="image"&gt;&lt;a href="#image" class="header-anchor"&gt;&lt;/a&gt;Image&#10;&lt;/h3&gt;&lt;p&gt;提供一些内置的 &lt;code&gt;SVG&lt;/code&gt;，可以直接通过 &lt;code&gt;Source&lt;/code&gt; 绑定 &lt;code&gt;StaticResource&lt;/code&gt; 值进行设置&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;Image&lt;/span&gt; &lt;span class="na"&gt;Source=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{StaticResource DirectoryConfig}&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;50&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;10&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="394px" data-flex-grow="164" height="429" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/SVGImage-1748076976389-77.png" width="706"&gt;&lt;/p&gt;&#10;&lt;h3 id="progressbar--loading"&gt;&lt;a href="#progressbar--loading" class="header-anchor"&gt;&lt;/a&gt;ProgressBar &amp;amp; Loading&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;重写 &lt;code&gt;ProgressBar&lt;/code&gt; 样式，提供圆角&lt;/li&gt;&#10;&lt;li&gt;可以通过 &lt;code&gt;ProgressBarProperty.ShowValue&lt;/code&gt; 属性设置进度条显示当前值&lt;/li&gt;&#10;&lt;li&gt;提供扩展函数 &lt;code&gt;SetAnimateValue&lt;/code&gt; 设置进度条的值，通过该函数设置可以显示动画&lt;/li&gt;&#10;&lt;li&gt;提供自定义控件圆形进度条 &lt;code&gt;Loading&lt;/code&gt;，仅用于等待功能&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;ProgressBar&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;40&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;400&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;d:Value=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;20&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;ProgressBar&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;40&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;400&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsIndeterminate=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;BaseWPFControl:Loading&lt;/span&gt; &lt;span class="na"&gt;Diameter=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;150&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;StrokeThickness=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;30&amp;#34;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;加载中，请等待...&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="217px" data-flex-grow="90" height="502" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/ProgressBar-1748076976389-78.png" width="454"&gt;&lt;/p&gt;&#10;&lt;h3 id="clock--calendar"&gt;&lt;a href="#clock--calendar" class="header-anchor"&gt;&lt;/a&gt;Clock &amp;amp; Calendar&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;重写 &lt;code&gt;Calender&lt;/code&gt; 样式&lt;/li&gt;&#10;&lt;li&gt;提供 自定义控件 &lt;code&gt;Clock&lt;/code&gt;，用于选择时间&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;Calendar&lt;/span&gt; &lt;span class="na"&gt;x:Name =&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Calendar&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;BaseWPFControl:Clock&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{Binding ActualHeight, ElementName=Calender}&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="352px" data-flex-grow="146" height="354" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/Calender-1748076976389-79.png" width="520"&gt;&lt;/p&gt;&#10;&lt;h3 id="tabcontrol"&gt;&lt;a href="#tabcontrol" class="header-anchor"&gt;&lt;/a&gt;TabControl&#10;&lt;/h3&gt;&lt;p&gt;重写 &lt;code&gt;TabControl&lt;/code&gt; 的样式&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;TabControl&lt;/span&gt; &lt;span class="na"&gt;TabStripPlacement=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Left&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;TabItem&lt;/span&gt; &lt;span class="na"&gt;Header=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;水调歌头&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;TextBlock&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{Binding Poetry1}&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;14&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/TabItem&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;TabItem&lt;/span&gt; &lt;span class="na"&gt;Header=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;如梦令&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;TextBlock&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{Binding Poetry2}&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;14&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/TabItem&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;TabItem&lt;/span&gt; &lt;span class="na"&gt;Header=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;破阵子&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;TextBlock&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;{Binding Poetry3}&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;14&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/TabItem&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;TabItem&lt;/span&gt; &lt;span class="na"&gt;Header=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;未启用&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;IsEnabled=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/TabControl&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1115px" data-flex-grow="464" height="227" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/TabControl-1748076976389-80.png" srcset="https://zeroszhang.github.io/p/basewpfcontrol/assets/TabControl-1748076976389-80_hu_dcf9d584c5c7a29b.png 800w, https://zeroszhang.github.io/p/basewpfcontrol/assets/TabControl-1748076976389-80.png 1055w" width="1055"&gt;&lt;/p&gt;&#10;&lt;h2 id="复杂控件"&gt;&lt;a href="#%e5%a4%8d%e6%9d%82%e6%8e%a7%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;复杂控件&#10;&lt;/h2&gt;&lt;h3 id="configcontrol"&gt;&lt;a href="#configcontrol" class="header-anchor"&gt;&lt;/a&gt;ConfigControl&#10;&lt;/h3&gt;&lt;p&gt;提供自定义控件 &lt;code&gt;ConfigControl&lt;/code&gt;，用于方便的实现配置界面&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;BaseWPFControl:ConfigControl&lt;/span&gt; &lt;span class="na"&gt;ConfigName=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;日期时间&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;BaseWPFControl:DateTimePicker&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/BaseWPFControl:ConfigControl&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;BaseWPFControl:ConfigControl&lt;/span&gt; &lt;span class="na"&gt;ConfigName=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;选择文件&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;BaseWPFControl:SelectFileBlock&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;280&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/BaseWPFControl:ConfigControl&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="209px" data-flex-grow="87" height="543" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/ConfigControl-1748076976389-81.png" width="473"&gt;&lt;/p&gt;&#10;&lt;h3 id="lisbox"&gt;&lt;a href="#lisbox" class="header-anchor"&gt;&lt;/a&gt;LisBox&#10;&lt;/h3&gt;&lt;p&gt;重写 &lt;code&gt;ListBox&lt;/code&gt; 的样式，可以绑定 &lt;code&gt;Enum/List/Dictionary&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="329px" data-flex-grow="137" height="292" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/ListBox-1748076976389-82.png" width="401"&gt;&lt;/p&gt;&#10;&lt;h3 id="listview"&gt;&lt;a href="#listview" class="header-anchor"&gt;&lt;/a&gt;ListView&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;重写 &lt;code&gt;ListView&lt;/code&gt; 的样式&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="290px" data-flex-grow="120" height="335" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/ListView-1748076976389-83.png" width="405"&gt;&lt;/p&gt;&#10;&lt;h3 id="datagrid"&gt;&lt;a href="#datagrid" class="header-anchor"&gt;&lt;/a&gt;DataGrid&#10;&lt;/h3&gt;&lt;p&gt;重写 &lt;code&gt;DataGrid&lt;/code&gt; 的样式，这里包含两种样式，一种是选择单元格，另一种是鼠标经过选中整行&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="选中单元格" class="gallery-image" data-flex-basis="386px" data-flex-grow="160" height="289" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/DataGrid-1748076976389-84.png" width="465"&gt;&#10;&lt;img alt="无法选中，鼠标经过选中整行" class="gallery-image" data-flex-basis="386px" data-flex-grow="160" height="289" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/ListViewDataGrid-1748076976389-85.png" width="465"&gt;&lt;/p&gt;&#10;&lt;h2 id="更新记录"&gt;&lt;a href="#%e6%9b%b4%e6%96%b0%e8%ae%b0%e5%bd%95" class="header-anchor"&gt;&lt;/a&gt;更新记录&#10;&lt;/h2&gt;&lt;p&gt;更新了部分 &lt;code&gt;BaseWPFControl&lt;/code&gt; 中的控件，实现了更多的功能。&lt;/p&gt;&#10;&lt;h3 id="优化listbox"&gt;&lt;a href="#%e4%bc%98%e5%8c%96listbox" class="header-anchor"&gt;&lt;/a&gt;优化&lt;code&gt;ListBox&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;实际使用了一下&lt;code&gt;ListBox&lt;/code&gt;之后发现还是有很多问题，尤其是关于调整属性之后，并且给出了更多的示例&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="317px" data-flex-grow="132" height="905" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-17_10-07-54-1748075157664-1-1748076976389-86.png" srcset="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-17_10-07-54-1748075157664-1-1748076976389-86_hu_60ab160927034459.png 800w, https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-17_10-07-54-1748075157664-1-1748076976389-86.png 1196w" width="1196"&gt;&lt;/p&gt;&#10;&lt;h3 id="新增baseclipborder"&gt;&lt;a href="#%e6%96%b0%e5%a2%9ebaseclipborder" class="header-anchor"&gt;&lt;/a&gt;新增&lt;code&gt;BaseClipBorder&lt;/code&gt;&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;实现了新的控件&lt;code&gt;BaseClipBorder&lt;/code&gt;来解决边框溢出和边框圆角缝隙的问题&lt;/li&gt;&#10;&lt;li&gt;最终实现如右图所示&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1266px" data-flex-grow="527" height="421" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-26_20-07-25-1748075157664-4-1748076976389-87.png" srcset="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-26_20-07-25-1748075157664-4-1748076976389-87_hu_c9033e7295d739fc.png 800w, https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-26_20-07-25-1748075157664-4-1748076976389-87_hu_808583ec8ffcac18.png 1600w, https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-26_20-07-25-1748075157664-4-1748076976389-87.png 2222w" width="2222"&gt;&lt;/p&gt;&#10;&lt;h3 id="优化progressbar"&gt;&lt;a href="#%e4%bc%98%e5%8c%96progressbar" class="header-anchor"&gt;&lt;/a&gt;优化ProgressBar&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;在上面&lt;code&gt;BaseClipBorder&lt;/code&gt;的基础上优化了&lt;code&gt;ProgressBar&lt;/code&gt;的实现&lt;/li&gt;&#10;&lt;li&gt;给出了垂直&lt;code&gt;ProgressBar&lt;/code&gt;例程实现&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="317px" data-flex-grow="132" height="905" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-26_20-10-51-1748075157664-3-1748076976389-88.gif" srcset="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-26_20-10-51-1748075157664-3-1748076976389-88_hu_eac4142a7423cdc3.gif 800w, https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-26_20-10-51-1748075157664-3-1748076976389-88.gif 1196w" width="1196"&gt;&lt;/p&gt;&#10;&lt;h3 id="新增defaultcontrolstyle和defaultwindowstyle"&gt;&lt;a href="#%e6%96%b0%e5%a2%9edefaultcontrolstyle%e5%92%8cdefaultwindowstyle" class="header-anchor"&gt;&lt;/a&gt;新增&lt;code&gt;DefaultControlStyle&lt;/code&gt;和&lt;code&gt;DefaultWindowStyle&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;这样设计的原因其实是为了移除掉&lt;code&gt;TextBlock&lt;/code&gt;的&lt;code&gt;FontSize&lt;/code&gt;属性和&lt;code&gt;FontFamily&lt;/code&gt;属性，改为直接从&lt;code&gt;Window&lt;/code&gt;或者&lt;code&gt;UserControl&lt;/code&gt;中继承字体属性。&lt;/p&gt;&#10;&lt;p&gt;而&lt;code&gt;DefaultControlStyle&lt;/code&gt;中定义了基础的&lt;code&gt;FontSize&lt;/code&gt;和&lt;code&gt;FontFamily&lt;/code&gt;样式，并且任何控件都可以使用。&lt;/p&gt;&#10;&lt;h3 id="优化button"&gt;&lt;a href="#%e4%bc%98%e5%8c%96button" class="header-anchor"&gt;&lt;/a&gt;优化&lt;code&gt;Button&lt;/code&gt;&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;删除了关于&lt;code&gt;ButtonShape&lt;/code&gt;属性的内容&lt;/li&gt;&#10;&lt;li&gt;新增了一些无边框按钮的样式&lt;/li&gt;&#10;&lt;li&gt;统一了&lt;code&gt;BorderBrush&lt;/code&gt;和&lt;code&gt;BorderThickness&lt;/code&gt;的风格&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="317px" data-flex-grow="132" height="905" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-26_20-04-46-1748075157664-2-1748076976389-89.png" srcset="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-26_20-04-46-1748075157664-2-1748076976389-89_hu_c38a3b61137a8814.png 800w, https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-26_20-04-46-1748075157664-2-1748076976389-89.png 1196w" width="1196"&gt;&lt;/p&gt;&#10;&lt;h3 id="优化combobox"&gt;&lt;a href="#%e4%bc%98%e5%8c%96combobox" class="header-anchor"&gt;&lt;/a&gt;优化&lt;code&gt;ComboBox&lt;/code&gt;&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;重写了&lt;code&gt;ComboBox&lt;/code&gt;的样式&lt;/li&gt;&#10;&lt;li&gt;新增&lt;code&gt;ComboBoxItem&lt;/code&gt;的样式&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="157px" data-flex-grow="65" height="379" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-26_20-15-22-1748075157664-5-1748076976389-90.png" width="249"&gt;&#10;&lt;img class="gallery-image" data-flex-basis="157px" data-flex-grow="65" height="379" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-26_20-15-01-1748075157664-6-1748076976390-99.png" width="249"&gt;&lt;/p&gt;&#10;&lt;h3 id="新增innerseparator属性"&gt;&lt;a href="#%e6%96%b0%e5%a2%9einnerseparator%e5%b1%9e%e6%80%a7" class="header-anchor"&gt;&lt;/a&gt;新增&lt;code&gt;InnerSeparator&lt;/code&gt;属性&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;新增&lt;code&gt;BaseWPFControl:ControlProperty.InnerSeparator&lt;/code&gt;属性，一般用于内部存在间隙属性调整&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Markdown" data-lang="Markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;Button Content=&amp;#34;图标&amp;#34; Margin=&amp;#34;10&amp;#34; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; BaseWPFControl:ButtonProperty.Icon=&amp;#34;{StaticResource HomePage}&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; BaseWPFControl:ControlProperty.InnerSeparator=&amp;#34;20&amp;#34; /&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1347px" data-flex-grow="561" height="99" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-26_20-34-49-1748075157665-7-1748076976390-92.png" width="556"&gt;&lt;/p&gt;&#10;&lt;h3 id="优化datagrid"&gt;&lt;a href="#%e4%bc%98%e5%8c%96datagrid" class="header-anchor"&gt;&lt;/a&gt;优化&lt;code&gt;DataGrid&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;在使用&lt;code&gt;DataGrid&lt;/code&gt;的时候，我发现有些属性没有效果，或者不尽如人意。&lt;/p&gt;&#10;&lt;p&gt;所以我就重新整理了一下&lt;code&gt;DataGrid&lt;/code&gt;的实现，并且给出了详细的案例。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="317px" data-flex-grow="132" height="905" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_09-40-06-1748075157665-8-1748076976390-98.png" srcset="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_09-40-06-1748075157665-8-1748076976390-98_hu_d5706db02a1d7126.png 800w, https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_09-40-06-1748075157665-8-1748076976390-98.png 1196w" width="1196"&gt;&#10;&lt;img class="gallery-image" data-flex-basis="317px" data-flex-grow="132" height="905" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_09-41-09-1748075157665-10-1748076976389-91.png" srcset="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_09-41-09-1748075157665-10-1748076976389-91_hu_9fe38363d7309f86.png 800w, https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_09-41-09-1748075157665-10-1748076976389-91.png 1196w" width="1196"&gt;&#10;&lt;img class="gallery-image" data-flex-basis="317px" data-flex-grow="132" height="905" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_09-41-14-1748075157665-9-1748076976390-93.png" srcset="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_09-41-14-1748075157665-9-1748076976390-93_hu_a8854a46a59afc0e.png 800w, https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_09-41-14-1748075157665-9-1748076976390-93.png 1196w" width="1196"&gt;&lt;/p&gt;&#10;&lt;h3 id="优化calendar和clock"&gt;&lt;a href="#%e4%bc%98%e5%8c%96calendar%e5%92%8cclock" class="header-anchor"&gt;&lt;/a&gt;优化&lt;code&gt;Calendar&lt;/code&gt;和&lt;code&gt;Clock&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="317px" data-flex-grow="132" height="905" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_13-59-15-1748075157665-11-1748076976390-94.png" srcset="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_13-59-15-1748075157665-11-1748076976390-94_hu_81947d20400248a9.png 800w, https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_13-59-15-1748075157665-11-1748076976390-94.png 1196w" width="1196"&gt;&lt;/p&gt;&#10;&lt;h3 id="优化flipbox"&gt;&lt;a href="#%e4%bc%98%e5%8c%96flipbox" class="header-anchor"&gt;&lt;/a&gt;优化&lt;code&gt;FlipBox&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="317px" data-flex-grow="132" height="905" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_13-59-39-1748075157665-12-1748076976390-95.png" srcset="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_13-59-39-1748075157665-12-1748076976390-95_hu_745365085763fd52.png 800w, https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_13-59-39-1748075157665-12-1748076976390-95.png 1196w" width="1196"&gt;&lt;/p&gt;&#10;&lt;h3 id="新增dialog显示成window"&gt;&lt;a href="#%e6%96%b0%e5%a2%9edialog%e6%98%be%e7%a4%ba%e6%88%90window" class="header-anchor"&gt;&lt;/a&gt;新增&lt;code&gt;Dialog&lt;/code&gt;显示成&lt;code&gt;Window&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;可以调用&lt;code&gt;ShowDialogAsWindow&lt;/code&gt;函数，将&lt;code&gt;Dialog&lt;/code&gt;显示成独立的&lt;code&gt;Window&lt;/code&gt;，就算没有&lt;code&gt;DialogContainer&lt;/code&gt;也能显示。使用体验和&lt;code&gt;WPF&lt;/code&gt;原生的&lt;code&gt;ShowDialog&lt;/code&gt;函数类似。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="317px" data-flex-grow="132" height="905" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_14-07-45-1748075157665-13-1748076976390-96.png" srcset="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_14-07-45-1748075157665-13-1748076976390-96_hu_2435c3031ea4fe52.png 800w, https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_14-07-45-1748075157665-13-1748076976390-96.png 1196w" width="1196"&gt;&#10;&lt;img class="gallery-image" data-flex-basis="317px" data-flex-grow="132" height="905" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_14-07-37-1748075157665-14-1748076976390-97.png" srcset="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_14-07-37-1748075157665-14-1748076976390-97_hu_a2ccb232533ff771.png 800w, https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_14-07-37-1748075157665-14-1748076976390-97.png 1196w" width="1196"&gt;&lt;/p&gt;&#10;&lt;h3 id="优化listbox-1"&gt;&lt;a href="#%e4%bc%98%e5%8c%96listbox-1" class="header-anchor"&gt;&lt;/a&gt;优化&lt;code&gt;ListBox&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;和之前的显示一致，只是使用&lt;code&gt;BaseClipBorder&lt;/code&gt;简化了内部实现。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="317px" data-flex-grow="132" height="905" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_14-21-24-1748075157665-15-1748076976390-101.png" srcset="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_14-21-24-1748075157665-15-1748076976390-101_hu_84881f83ae5ec86.png 800w, https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_14-21-24-1748075157665-15-1748076976390-101.png 1196w" width="1196"&gt;&lt;/p&gt;&#10;&lt;h3 id="优化listview"&gt;&lt;a href="#%e4%bc%98%e5%8c%96listview" class="header-anchor"&gt;&lt;/a&gt;优化&lt;code&gt;ListView&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="317px" data-flex-grow="132" height="905" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_16-19-43-1748075157665-16-1748076976390-102.png" srcset="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_16-19-43-1748075157665-16-1748076976390-102_hu_843f42e192f84fc6.png 800w, https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_16-19-43-1748075157665-16-1748076976390-102.png 1196w" width="1196"&gt;&lt;/p&gt;&#10;&lt;h3 id="优化smoothprogress"&gt;&lt;a href="#%e4%bc%98%e5%8c%96smoothprogress" class="header-anchor"&gt;&lt;/a&gt;优化&lt;code&gt;SmoothProgress&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;这里省事，直接让&lt;code&gt;SmoothProgressBar&lt;/code&gt;使用&lt;code&gt;ProgressBar&lt;/code&gt;的样式&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="317px" data-flex-grow="132" height="905" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_17-44-38-1748075157665-18-1748076976390-100.png" srcset="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_17-44-38-1748075157665-18-1748076976390-100_hu_6b43b067cbea1b83.png 800w, https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-03-28_17-44-38-1748075157665-18-1748076976390-100.png 1196w" width="1196"&gt;&lt;/p&gt;&#10;&lt;h3 id="新增simplescrollviewer样式"&gt;&lt;a href="#%e6%96%b0%e5%a2%9esimplescrollviewer%e6%a0%b7%e5%bc%8f" class="header-anchor"&gt;&lt;/a&gt;新增&lt;code&gt;SimpleScrollViewer&lt;/code&gt;样式&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;该样式没有滚动条，只有箭头按钮，并且增加了滚动动画&lt;/li&gt;&#10;&lt;li&gt;主要用于&lt;code&gt;TabControl&lt;/code&gt;的&lt;code&gt;Header&lt;/code&gt;部分&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="411px" data-flex-grow="171" height="808" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-04-02_11-18-51-1748075157665-17-1748076976392-103.png" srcset="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-04-02_11-18-51-1748075157665-17-1748076976392-103_hu_2965340e0ee62fdf.png 800w, https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-04-02_11-18-51-1748075157665-17-1748076976392-103.png 1386w" width="1386"&gt;&lt;/p&gt;&#10;&lt;h3 id="优化tabcontrol"&gt;&lt;a href="#%e4%bc%98%e5%8c%96tabcontrol" class="header-anchor"&gt;&lt;/a&gt;优化&lt;code&gt;TabControl&lt;/code&gt;&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;优化了微软原生样式下，&lt;code&gt;TabItem&lt;/code&gt;溢出的问题&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="411px" data-flex-grow="171" height="808" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-04-02_11-19-13-1748075157665-19-1748076976392-104.png" srcset="https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-04-02_11-19-13-1748075157665-19-1748076976392-104_hu_a6a55185d73529ef.png 800w, https://zeroszhang.github.io/p/basewpfcontrol/assets/PixPin_2025-04-02_11-19-13-1748075157665-19-1748076976392-104.png 1386w" width="1386"&gt;&lt;/p&gt;&#10;</description></item></channel></rss>