工控视觉项目桌面端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 导航与权限

  1. 动态菜单
    - 主菜单(左侧 11 项)与导航页签(顶部 5 项)全部通过 枚举 + ObservableCollection 生成,支持“角色灰度”——当用户为“操作员”时,自动禁用“系统参数”、“特殊设置”等高危入口。
  2. 登录 & 角色
    - Login.xaml 弹出后返回 DialogResultMainVM 根据 RoleEnum 动态刷新 MenuItemModelsIsEnabled 属性;
    - 密码修改走 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 提供 NotifyPropertyChangeSetProperty
Command 按钮 / 菜单 RelayCommand 支持 CanExecute 动态灰度
线程安全 弹窗 / 日志 统一走 MainWindow.dispatcher.BeginInvoke
模板方法 耗时操作 抽象 ShowProgressAsync() → 子类覆写 DoWork()
观察者 实时轮廓叠加 视觉 Service 触发 OnMatchResult → 主画面订阅更新

五、性能与体验优化

  1. 虚拟化
    - 所有 DataGrid 开启 EnableRowVirtualization=True,100 万行轨迹点内存占用 < 150 MB。
  2. 延迟加载
    - 导航页签首次点击时才实例化 UserControl,避免启动时 5 个模块全部初始化。
  3. 防抖
    - TextBox 输入“胶阀速度”时,通过 ReactiveExtensions 节流 300 ms,减少连续写寄存器。
  4. 资源合并
    - 图片全部转为 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 持续升级奠定架构基础。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐