<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[samble的专栏]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/samble</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; samble]]></copyright><item><title><![CDATA[从零搭建半导体设备上位机（九）：拖拽与交互，Adorner、DragDrop 与晶圆拖放信息]]></title><link>https://blog.csdn.net/samble/article/details/168884293</link><guid>https://blog.csdn.net/samble/article/details/168884293</guid><author>samble</author><pubDate>Mon, 09 Nov 2026 07:21:26 +0800</pubDate><description><![CDATA[拖拽与交互：Adorner、DragDrop 与晶圆拖放信息 这是「从零搭建半导体设备上位机」系列第9篇，也是界面骨架这批的最后一篇。晶圆从一个腔拖到另一个腔，看起来是个纯 UI 动作，实际牵着"能不能拖、能拖到哪、拖过去之后设备认不认"三层判断。 一次"拖过去没反应" 第一版拖拽上线那天，操作员把一片晶圆从 Loadlock 拖到腔体 A，松手，什么都没发生。 不是报错，不是卡住，是完全没反应—]]></description><category></category></item><item><title><![CDATA[从零搭建半导体设备上位机（八）：自定义控件（二），阀门控件家族——气体阀、水阀、MFC 阀]]></title><link>https://blog.csdn.net/samble/article/details/168884286</link><guid>https://blog.csdn.net/samble/article/details/168884286</guid><author>samble</author><pubDate>Sun, 08 Nov 2026 08:22:00 +0800</pubDate><description><![CDATA[自定义控件（二）：阀门控件家族——气体阀、水阀、MFC 阀 这是「从零搭建半导体设备上位机」系列第8篇。上一篇讲状态灯，这一篇讲阀门。阀门控件是这套界面里被点得最多的东西，也是最容易出安全事故的地方。 从一条 git 记录说起 翻提交历史，有一条特别短： "添加透明按钮用于点击"——这句话本身就说明出了问题：原来的点击区域不能点了。 事实是：气体阀控件用的是三张素材图（关闭态、打开态、中间态），切]]></description><category></category></item><item><title><![CDATA[从零搭建半导体设备上位机（七）：自定义控件（一），三色灯、到位指示与状态指示器]]></title><link>https://blog.csdn.net/samble/article/details/168884280</link><guid>https://blog.csdn.net/samble/article/details/168884280</guid><author>samble</author><pubDate>Sat, 07 Nov 2026 16:36:19 +0800</pubDate><description><![CDATA[自定义控件（一）：三色灯、到位指示与状态指示器 这是「从零搭建半导体设备上位机」系列第7篇。上一篇讲了 XAML 的组织，这一篇进到最细的粒度：一个"就画个圈"的状态灯控件，为什么写了 74 行 XAML 加 124 行代码。 一个"就画个圈"的控件，写了 124 行 第一次看到 BreatheLight.xaml.cs 的时候，我的反应是：这玩意儿有 124 行？ XAML 那边 74 行，一共]]></description><category></category></item><item><title><![CDATA[从零搭建半导体设备上位机（六）：十五万行 XAML 的组织法，7 个资源字典与全局样式基线]]></title><link>https://blog.csdn.net/samble/article/details/168884275</link><guid>https://blog.csdn.net/samble/article/details/168884275</guid><author>samble</author><pubDate>Fri, 06 Nov 2026 07:18:03 +0800</pubDate><description><![CDATA[十五万行 XAML 的组织法：7 个资源字典与全局样式基线 这是「从零搭建半导体设备上位机」系列第6篇。上一篇讲了三个 UI 库怎么不打架。这一篇讲更实际的问题：一个 156,524 行 XAML 的工程，到底该怎么组织，才不会变成一坨谁也改不动的石头。 先别被行数吓到 上一篇说"十五万行 XAML"，听起来像个灾难。但把它按目录拆开统计，结论完全不一样： 真正需要人维护的界面布局只有 27,11]]></description><category></category></item><item><title><![CDATA[从零搭建半导体设备上位机（五）：三套 UI 库共存，HandyControl、MaterialDesign、Wu.Wpf 的样式基线]]></title><link>https://blog.csdn.net/samble/article/details/168884266</link><guid>https://blog.csdn.net/samble/article/details/168884266</guid><author>samble</author><pubDate>Thu, 05 Nov 2026 18:34:49 +0800</pubDate><description><![CDATA[三套 UI 库共存：HandyControl、MaterialDesign、Wu.Wpf 的样式基线 这是「从零搭建半导体设备上位机」系列第5篇。一个 WPF 应用里同时装了 HandyControl、MaterialDesignThemes、Wu.Wpf 三套控件库。这篇讲它们为什么会打架、打架的具体机制是什么，以及怎么建立一套"谁也别想偷偷改我外观"的样式基线。 一个下拉框，白底白字 界面做完]]></description><category></category></item><item><title><![CDATA[从零搭建半导体设备上位机（四）：单实例、启动流程与配置文件，App 里那 526 行到底在干什么]]></title><link>https://blog.csdn.net/samble/article/details/168884261</link><guid>https://blog.csdn.net/samble/article/details/168884261</guid><author>samble</author><pubDate>Tue, 03 Nov 2026 21:25:39 +0800</pubDate><description><![CDATA[单实例、启动流程与配置文件：App 里那 526 行到底在干什么 这是「从零搭建半导体设备上位机」系列第4篇。上一篇讲了两套 MVVM 框架怎么分。这一篇拆开那个 526 行的 App.xaml.cs：启动时到底按什么顺序做事、两套配置文件各管什么、以及几个"看起来没事其实有坑"的写法。 打开这个文件之前 上一篇我说过，RegisterTypes 有两百行。那剩下的三百多行在干什么？ 答案是：启动]]></description><category></category></item><item><title><![CDATA[从零搭建半导体设备上位机（三）：CommunityToolkit.Mvvm 与 Prism 混用，哪些用源生成器，哪些手写]]></title><link>https://blog.csdn.net/samble/article/details/168884254</link><guid>https://blog.csdn.net/samble/article/details/168884254</guid><author>samble</author><pubDate>Thu, 29 Oct 2026 07:07:48 +0800</pubDate><description><![CDATA[CommunityToolkit.Mvvm 与 Prism 混用：哪些用源生成器，哪些手写 这是「从零搭建半导体设备上位机」系列第3篇。上一篇说主 ViewModel 是单例、注册集中在一个方法里。这一篇处理一个更麻烦的问题：项目里同时存在 Prism 的 MVVM 体系和 CommunityToolkit.Mvvm，到底该怎么分。 同一个项目里，有三套基类 把整个解决方案扫一遍，按"属性通知怎么]]></description><category></category></item><item><title><![CDATA[从零搭建半导体设备上位机（二）：Prism + DryIoc，五个工程与区域导航怎么串起来]]></title><link>https://blog.csdn.net/samble/article/details/168884250</link><guid>https://blog.csdn.net/samble/article/details/168884250</guid><author>samble</author><pubDate>Sun, 25 Oct 2026 21:43:28 +0800</pubDate><description><![CDATA[Prism + DryIoc：五个工程与区域导航怎么串起来 这是「从零搭建半导体设备上位机」系列第2篇。上一篇定了三层架构，这一篇把骨架落地：五个工程怎么划边界、App 启动时到底按什么顺序跑、区域导航怎么组织，以及一个 526 行的 App.xaml.cs 里藏着的三个坑。 一个方法写了两百行 项目第一次交给我 review 的时候，我打开 App.xaml.cs，滚了十几屏，全是 Regist]]></description><category></category></item><item><title><![CDATA[从零搭建半导体设备上位机（一）：半导体上位机为什么要自己写，从产线需求到架构全景]]></title><link>https://blog.csdn.net/samble/article/details/168884243</link><guid>https://blog.csdn.net/samble/article/details/168884243</guid><author>samble</author><pubDate>Fri, 23 Oct 2026 22:48:36 +0800</pubDate><description><![CDATA[半导体上位机为什么要自己写：从产线需求到架构全景 这是「从零搭建半导体设备上位机」系列第1篇。从一台半导体设备的产线需求出发，搞清楚上位机为什么必须自己写，再把分层、选型和项目骨架摊开看一遍。这一篇不写业务代码，只解决"为什么这么搭"。 设备到厂那天，界面还没人写 设备进厂调试那阵子，最尴尬的不是机械手对不上位，也不是真空抽不下去，而是——所有东西都能动，就是没有一个界面能让人看见它在动。 PLC]]></description><category></category></item><item><title><![CDATA[从零搭建灌装监控系统（二十一）：项目打包与部署，完结篇]]></title><link>https://blog.csdn.net/samble/article/details/166645324</link><guid>https://blog.csdn.net/samble/article/details/166645324</guid><author>samble</author><pubDate>Sat, 17 Oct 2026 08:33:16 +0800</pubDate><description><![CDATA[项目打包与部署（完结篇） 这是「从零搭建灌装监控系统」系列第21篇，也是最后一篇。功能写完了，测试过了，但把整个目录拷到现场机器上双击，它不一定跑得起来。这篇把系统打成真正能交付的包：发布配置、自包含运行时、单文件的取舍，以及首次启动必须自动完成的初始化。 拷过去打不开 第一次交付的时候，我把开发机上 bin\Debug 整个目录拷到 U 盘，拿到现场，双击 exe。 弹了一个框：“需要安装 .N]]></description><category></category></item><item><title><![CDATA[从零搭建灌装监控系统（二十）：用户认证与权限管理]]></title><link>https://blog.csdn.net/samble/article/details/166645318</link><guid>https://blog.csdn.net/samble/article/details/166645318</guid><author>samble</author><pubDate>Fri, 16 Oct 2026 08:14:50 +0800</pubDate><description><![CDATA[用户认证与权限管理 这是「从零搭建灌装监控系统」系列第20篇。谁都能改工艺参数，这件事迟早会出事。这篇实现密码哈希、三级角色和登录窗口，并处理两个容易做错的点：固定盐为什么不安全，以及密码框为什么天生不能绑定。 操作员把工艺参数改了 现场调试的时候，我给了操作员一个账号，本意只是让他看数据。 第二天工艺工程师找过来，说配方里的加热温度被人从 180 改成 175，找不出是谁改的。查了半天，只能确定]]></description><category></category></item><item><title><![CDATA[从零搭建灌装监控系统（十九）：单元测试实战，xUnit + 内存SQLite + 反射测试私有方法]]></title><link>https://blog.csdn.net/samble/article/details/166645307</link><guid>https://blog.csdn.net/samble/article/details/166645307</guid><author>samble</author><pubDate>Tue, 13 Oct 2026 08:27:45 +0800</pubDate><description><![CDATA[单元测试实战：xUnit + 内存SQLite + 反射测试私有方法 这是「从零搭建灌装监控系统」系列第19篇。前面十八篇写完，每次改动都得手动点一遍界面才能确认没坏。这篇搭起测试工程：用临时 SQLite 文件做数据隔离，用 fixture 共享数据库生命周期，再用反射把私有方法拉出来测。 改一行导出逻辑，手动验了半小时 CSV 导出那里我改了一个条件——把时间范围从闭区间改成半开区间。 改完要]]></description><category></category></item><item><title><![CDATA[从零搭建灌装监控系统（十八）：自定义控件，三色灯与状态指示]]></title><link>https://blog.csdn.net/samble/article/details/166645304</link><guid>https://blog.csdn.net/samble/article/details/166645304</guid><author>samble</author><pubDate>Mon, 12 Oct 2026 17:34:37 +0800</pubDate><description><![CDATA[自定义控件：三色灯与状态指示 这是「从零搭建灌装监控系统」系列第18篇。界面上的红绿圆点、状态标签、液位指示，一开始都是复制粘贴出来的。这篇把它们做成可复用的自定义控件，用依赖属性和值转换器驱动，并讲清一个特别容易踩的 WPF 规则：本地值为什么会盖掉触发器。 改一次配色，翻了十四个文件 界面做到第八个页面的时候，我决定把状态灯的绿色调深一点——现在这个绿在车间的强光下有点发白。 结果我改了十四处]]></description><category></category></item><item><title><![CDATA[从零搭建灌装监控系统（十七）：LiveCharts 实时温度曲线]]></title><link>https://blog.csdn.net/samble/article/details/166645295</link><guid>https://blog.csdn.net/samble/article/details/166645295</guid><author>samble</author><pubDate>Sun, 11 Oct 2026 09:19:52 +0800</pubDate><description><![CDATA[LiveCharts 实时温度曲线 这是「从零搭建灌装监控系统」系列第17篇。数字只能告诉你此刻的温度，曲线才能告诉你温度在往哪走。这篇用 LiveCharts 画实时温度，重点不是“怎么画出来”，而是怎么在几百毫秒一次的刷新下不卡、不崩、不无限膨胀。 曲线跑到第二天就卡住了 首页加温度曲线的时候，我的实现非常朴素：每次收到数据就往 ChartValues 里 Add 一个点。 刚开始特别顺。跑了]]></description><category></category></item><item><title><![CDATA[从零搭建灌装监控系统（十六）：Dashboard 设计，KPI卡片与液位可视化]]></title><link>https://blog.csdn.net/samble/article/details/166645287</link><guid>https://blog.csdn.net/samble/article/details/166645287</guid><author>samble</author><pubDate>Thu, 08 Oct 2026 13:02:22 +0800</pubDate><description><![CDATA[Dashboard 设计：KPI卡片与液位可视化 这是「从零搭建灌装监控系统」系列第16篇。前面十五篇把通信、数据、报警、日志都做完了，但操作员每天盯着的是首页。这篇把后端数据翻译成一眼能看懂的东西：四张 KPI 卡片、一个液位柱、一个会呼吸的阀门指示灯。 数据都对，但没人看得懂 功能联调的时候，我在首页上放了一排 Label，把设备状态原样显示出来：产量 102、温度 25.6、运行时间 4.2]]></description><category></category></item><item><title><![CDATA[从零搭建灌装监控系统（十五）：日志查看器，筛选与分页]]></title><link>https://blog.csdn.net/samble/article/details/166644524</link><guid>https://blog.csdn.net/samble/article/details/166644524</guid><author>samble</author><pubDate>Wed, 07 Oct 2026 18:59:52 +0800</pubDate><description><![CDATA[日志查看器：筛选与分页 这是「从零搭建灌装监控系统」系列第15篇。上一篇把日志写进了 SQLite，但能保存不等于能使用。日志查看器要让操作员快速找到一段时间内的错误，也要让开发人员按级别和关键字缩小范围。这篇围绕 LogsViewModel 实现查询条件、50条分页、忙碌状态和导出入口。 日志很多，真正有用的只有几行 设备断线那天，日志窗口里有几千条轮询信息。操作员滚动了很久，还是没找到第一次断]]></description><category></category></item><item><title><![CDATA[从零搭建灌装监控系统（十四）：Serilog四路日志输出]]></title><link>https://blog.csdn.net/samble/article/details/166644523</link><guid>https://blog.csdn.net/samble/article/details/166644523</guid><author>samble</author><pubDate>Tue, 06 Oct 2026 20:14:35 +0800</pubDate><description><![CDATA[Serilog 四路日志输出 这是「从零搭建灌装监控系统」系列第14篇。报警系统需要日志，设备通信需要日志，配置保存也需要日志。真正让人头疼的不是写一条日志，而是同一条日志如何同时服务现场操作员、开发调试、历史查询和问题定位。这篇用 Serilog 设计文件、SQLite、控制台和 UI 四路输出。 出了问题，日志却只在窗口里 调试阶段，最方便的写法是把信息追加到 RichTextBox。程序运行]]></description><category></category></item><item><title><![CDATA[从零搭建灌装监控系统（十三）：报警系统设计，生命周期与通知]]></title><link>https://blog.csdn.net/samble/article/details/166644521</link><guid>https://blog.csdn.net/samble/article/details/166644521</guid><author>samble</author><pubDate>Mon, 05 Oct 2026 19:33:25 +0800</pubDate><description><![CDATA[报警系统设计：生命周期与通知 这是「从零搭建灌装监控系统」系列第13篇。报警系统不能只写一个 IsAlarm = true。一条报警需要知道什么时候触发、什么时候恢复、是否确认、由谁确认，以及如何通知页面和日志。这篇把报警生命周期拆开，再用服务、数据库和事件把它们串起来。 红灯亮了，但没人知道它为什么亮 早期版本的报警处理很简单：设备状态异常时把一个布尔属性设成 true，界面用红色触发器显示；状]]></description><category></category></item><item><title><![CDATA[从零搭建灌装监控系统（十二）：配置系统，原子写入与容错]]></title><link>https://blog.csdn.net/samble/article/details/166644517</link><guid>https://blog.csdn.net/samble/article/details/166644517</guid><author>samble</author><pubDate>Sun, 04 Oct 2026 06:50:54 +0800</pubDate><description><![CDATA[配置系统：原子写入与容错 这是「从零搭建灌装监控系统」系列第12篇。配置文件看起来只是几行 JSON，真正运行在现场以后，它却承担了设备地址、串口参数和操作偏好。这篇不讨论怎么反序列化对象，而是解决保存过程中最容易被忽略的三个问题：原子写入、并发保存和损坏恢复。 断电以后，设备参数变成半个 JSON 现场调试时，操作员改了串口号，点击保存，程序马上退出。第二次启动时，系统提示配置格式错误，设备也连]]></description><category></category></item><item><title><![CDATA[从零搭建灌装监控系统（十一）：CSV流式导出，大数据量也不拖垮界面]]></title><link>https://blog.csdn.net/samble/article/details/166644514</link><guid>https://blog.csdn.net/samble/article/details/166644514</guid><author>samble</author><pubDate>Fri, 02 Oct 2026 16:43:40 +0800</pubDate><description><![CDATA[CSV 流式导出 这是「从零搭建灌装监控系统」系列第11篇。生产记录已经落到 SQLite，但现场人员还需要按日期导出数据。这篇实现 CSV 导出，重点不只是“能写文件”，还要处理大数据量、中文编码、分隔符、文件占用和取消操作。 导出按钮把软件卡死了 有一次测试数据只有几百条，点击导出很快就结束了。于是有人把“查询全部记录，再一次性写 CSV”的代码提交了。上线后数据量涨到几万条，操作员点下按钮，]]></description><category></category></item></channel></rss>