工控视觉项目桌面端WPF源码,UI源码,已实现前后端MVVM数据绑定。 除了两个柱状图用的第三...
VDUI 通过“强隔离的 MVVM + 统一的事件总线 + 可插拔 Service”三板斧,把视觉点胶领域的高复杂度交互拆解成“可单元测试、可并行开发、可热插拔”的模块化结构。后续无论新增AI 缺陷检测、还是云端 OTA 升级,都只需在 Service 层横向扩展,主工程与 UI 零改动,为产线 7×24 持续升级奠定架构基础。
工控视觉项目桌面端WPF源码,UI源码,已实现前后端MVVM数据绑定。 除了两个柱状图用的第三方开源控件,其他都是原生自己写的,非常适合初学者熟悉语法、事件、触发器、MVVM 机制、布局容器,方便二次开发和修改

版本:V1.0

工控视觉项目桌面端WPF源码,UI源码,已实现前后端MVVM数据绑定。 除了两个柱状图用的第三方开源控件,其他都是原生自己写的,非常适合初学者熟悉语法、事件、触发器、MVVM 机制、布局容器,方便二次开发和修改

作者:资深软件工程师 / 技术文档组
一、项目定位
Vision Dispensing UI(以下简称“VDUI”)是一套面向“在线视觉点胶机”的桌面端人机交互系统,采用 WPF + MVVM 架构,负责把视觉算法、运动控制、MES 报文、统计报表等底层能力以“可配置、可扩展、可调试”的方式呈现给操作员 / 工程师 / 供应商三种角色。
二、总体架构
| 层级 | 技术 | 职责 | 关键约定 |
|---|---|---|---|
| View | XAML + UserControl | 纯 UI,零业务逻辑 | 只通过 {Binding} 访问 VM |
| ViewModel | C# + INotifyPropertyChanged | 封装“状态 + 命令”,负责“协调” | 绝不引用任何控件 |
| Model | C# POCO / Enum | 实体、枚举、配置 | 无依赖,可单元测试 |
| Service | 静态类 / IoC(预留) | 真正的“胶水”——算法、运动、MES、日志 | 对外暴露 Task 或 事件 |
| Threading | Dispatcher + BackgroundWorker | 保证 UI 线程安全 | 统一通过 DevParas.dispatcher 回 UI |
注:源码中所有 `*.xaml.cs` 仅保留“**控件事件 → VM 命令**”的 1 行转发代码,彻底杜绝“代码后置业务”。
三、核心功能模块
3.1 导航与权限
- 动态菜单
- 主菜单(左侧 11 项)与导航页签(顶部 5 项)全部通过 枚举 + ObservableCollection 生成,支持“角色灰度”——当用户为“操作员”时,自动禁用“系统参数”、“特殊设置”等高危入口。 - 登录 & 角色
- Login.xaml 弹出后返回DialogResult,MainVM根据RoleEnum动态刷新MenuItemModels的IsEnabled属性;
- 密码修改走UserModify.xaml,与登录窗体解耦。
3.2 视觉模板学习(ModelLearning)
| 步骤 | 用户感知 | 内部流程 |
|---|---|---|
| ① 选择模板类型 | ComboBox 绑定 List |
切换“几何/灰度/NCC/检测”四种算法 |
| ② ROI 绘制 | 点击“显示 ROI” | 调用 Halcon Service 接口,返回 HObject,转 WPF ImageBrush 显示 |
| ③ 学习 | 点击“学习” | 后台线程执行 LearnShapeModelAsync(),进度条通过 WaittingMessageBox 模态弹出 |
| ④ 保存 | 点击“保存模板” | 序列化到 .\Model\{ProductNo}\Template_ID.tup,同时刷新 DataGrid |
关键点:
- 所有耗时操作统一包成 `Task`,通过 `Dispatcher` 回写 `LearnEnabled / TempleteSaveEnabled` 等属性,界面零卡顿。
- 模板匹配结果通过 **事件总线** 抛给主画面,供“主画面”实时叠加轮廓。
3.3 轨迹示教(Teach)
- 轨迹类型:点 / 直线 / 圆弧 / 圆,四种
TraceEnum对应不同参数集合; - 示教流程:
1. 手动移动轴到起点 → 点击“记录起点” → VM 把当前机械坐标写入XPositionTeachStart三联属性;
2. 同理记录“中点”“终点”;
3. 点击“生成轨迹” → 调用 运动卡 Service 生成插补文件;
4. 点击“下载到控制器” → 出现DownLoadBarForm进度条,支持后台取消(CancellationTokenSource)。 - 防呆:当
BoxPathMoveConnectDou勾选时,VM 自动把“相邻轨迹”首尾相连,减少空行程。
3.4 点胶参数配方(DispenseParam)
- 支持 10 组配方(1# ~ 10#),每组包含:
- 胶阀速度 / 回吸时间 / 提前关胶距离 / 滞后开胶距离;
- 所有参数绑定到
TeachVM.DispenseParam对象,属性变更即自动写入本地 SQLite; - 切换配方时通过
ICommand触发DispenseParam_Changed事件,运动卡在 200 ms 内完成参数热更新。
3.5 统计与追溯(Statistics)
- 数据源:本地 SQLite + 可选 MES 接口;
- 图表:使用 LiveCharts.Wpf,在
StatisticsVM.PopulateChart()中按“小时 / 班 / 日”聚合; - 查询条件:
- 时间区间通过 自制 DateTimePicker 控件(支持秒级);
- 产品二维码支持模糊查询;
- 所有条件变化即触发
ICommand.QueryCommand,内部使用DelegateCommand + async防止 UI 阻塞。
3.6 异常与消息
- 统一弹框:
CustomMessageBox(信息)CancelMessageBox(确认 / 取消)WaittingMessageBox(进度条可取消)- 事件总线:
DevParas.messageManager内部维护Queue;ProcessDocuments后台线程每秒轮询,检测到MainWindowShow==true时,通过Dispatcher弹出窗口,保证 任何线程都能安全写日志。
四、关键设计模式
| 模式 | 应用场景 | 实现要点 |
|---|---|---|
| MVVM | 所有 XAML 页面 | ViewModelBase 提供 NotifyPropertyChange 与 SetProperty |
| Command | 按钮 / 菜单 | RelayCommand 支持 CanExecute 动态灰度 |
| 线程安全 | 弹窗 / 日志 | 统一走 MainWindow.dispatcher.BeginInvoke |
| 模板方法 | 耗时操作 | 抽象 ShowProgressAsync() → 子类覆写 DoWork() |
| 观察者 | 实时轮廓叠加 | 视觉 Service 触发 OnMatchResult → 主画面订阅更新 |
五、性能与体验优化
- 虚拟化
- 所有 DataGrid 开启EnableRowVirtualization=True,100 万行轨迹点内存占用 < 150 MB。 - 延迟加载
- 导航页签首次点击时才实例化 UserControl,避免启动时 5 个模块全部初始化。 - 防抖
- TextBox 输入“胶阀速度”时,通过ReactiveExtensions节流 300 ms,减少连续写寄存器。 - 资源合并
- 图片全部转为 PNG + Resource 内嵌,杜绝运行时文件缺失;
- 字体(Source Han Sans CN)子集化,安装包减小 11 MB。
六、二次开发指南
| 需求场景 | 推荐做法 |
|---|---|
| 新增一个算法页 | 1. 新建 NewAlgoVM : ViewModelBase 2. 在 NavEnum 增加枚举值 3. MainVM.NavigateMenuModels 动态加入页签 4. XAML 绑定即生效,零代码改动主工程 |
| 调用第三方 DLL | 在 Service 层新增 ExternalAlgoProxy,内部 DllImport 并转换为 Task,供 VM 异步调用 |
| 换皮肤 | 全局样式集中在 Themes\Generic.xaml,替换 Brush / FontFamily 即可;支持运行时切换 |
| 多语言 | 所有字符串已抽取到 Resources.resx,新增 Resources.zh-CN.resx 后,在 App.xaml.cs 切换 CultureInfo |
七、常见坑与排查
| 现象 | 根因 | 快速定位 |
|---|---|---|
| 弹框不居中 | 多屏 DPI 差异 | WindowStartupLocation=CenterOwner 必须设置 Owner=MainWindow |
| 图表不刷新 | LiveCharts 线程模型 | 确保 SeriesCollection 新增项走 UI 线程 |
| 轨迹下载卡 99% | 运动卡返回长度 ≠ 期望长度 | 查看 DownLoadBarVM.Logs 实时输出 |
| 模板匹配无轮廓 | Halcon HObject 未 Dispose | 使用 HObject.Dispose() 并配合 using |
八、结语
VDUI 通过“强隔离的 MVVM + 统一的事件总线 + 可插拔 Service”三板斧,把视觉点胶领域的高复杂度交互拆解成“可单元测试、可并行开发、可热插拔”的模块化结构。后续无论新增 AI 缺陷检测、还是 云端 OTA 升级,都只需在 Service 层横向扩展,主工程与 UI 零改动,为产线 7×24 持续升级奠定架构基础。






更多推荐


所有评论(0)