框架设计(Maxwell 无功老化上位机)

张开发
2026/4/10 17:33:39 15 分钟阅读

分享文章

框架设计(Maxwell 无功老化上位机)
框架设计Maxwell 无功老化上位机项目名称Maxwell架构WPF Prism 8MVVM Region 模块化 依赖注入命名空间Maxwell.UI核心 UI 层核心目标完全复刻「主界面.PNG」布局左侧导航栏 中间测试站垂直堆叠区 右侧 Tab图表测量仪表日志根据stations.json动态加载 A~F 站新增站只需改 JSON无需改任何 UI 代码测试区可自由启用/禁用在“配置管理”中切换禁用后自动隐藏中间面板和右侧 Tab支持E 站特殊状态IDLE 蓝色高亮 首按钮变为“自动”严格MVVM所有测量值、日志、波形实时数据绑定硬件配置已完整集成IP/Port后台预留 Socket/Modbus 扩展点高可扩展新增站 / 新增设备只需改 JSON 配置文件技术栈PrismPrismApplicationBindableBaseDelegateCommandIContainerRegistryCommunityToolkit.Mvvm可选辅助 ObservableSystem.Text.Json配置加载OxyPlot.Wpf波形图表推荐或 LiveCharts.Wpf通信层ICommunicationService后续可替换为 Socket / Modbus / OPC UA项目目录结构所有页面和用户控件Maxwell.UI ├── App.xaml ├── App.xaml.cs // PrismApplication 启动 ├── Bootstrapper.cs // (可选) Prism 引导 ├── stations.json // 配置 JSON复制您提供的 JSON │ ├── Models/ │ ├── StationConfig.cs │ ├── HardwareDevice.cs │ ├── MeasurementData.cs │ └── ConfigData.cs // 根 JSON 包装 │ ├── ViewModels/ │ ├── MainViewModel.cs // 主窗体 VM │ ├── StationViewModel.cs // 单个测试站 VM含 E 站特殊逻辑 │ ├── MeasurementViewModel.cs // 右侧仪表盘数据 │ └── ConfigurationViewModel.cs // 配置管理对话框 VM │ ├── Views/ │ ├── MainWindow.xaml // 主窗口Grid 三列布局 │ ├── MainWindow.xaml.cs │ ├── StationPanelView.xaml // 中间每个测试站面板UserControl │ ├── StationPanelView.xaml.cs │ ├── MeasurementDashboardView.xaml // 右侧仪表 图表 日志UserControl │ ├── MeasurementDashboardView.xaml.cs │ ├── NavigationMenuView.xaml // 左侧导航栏UserControl可 Region │ ├── NavigationMenuView.xaml.cs │ ├── ConfigurationDialog.xaml // 配置管理弹窗 │ └── ConfigurationDialog.xaml.cs │ ├── Services/ │ ├── IConfigService.cs │ ├── ConfigService.cs // 加载/保存 stations.json IsEnabled │ ├── ICommunicationService.cs │ └── CommunicationService.cs // Socket/Modbus 占位 │ ├── Resources/ │ └── Styles.xaml // 全局样式Offline/IDLE 颜色、按钮模板 │ └── Modules/ // 如需后续扩展模块化 └── (可选)详细 WPF 代码核心文件1. Models直接复制即可StationConfig.cspublicclassStationConfig{publicstringStationId{get;set;}string.Empty;publicstringName{get;set;}string.Empty;publicstringDescription{get;set;}string.Empty;publicListHardwareDeviceHardwareDevices{get;set;}new();publicboolIsEnabled{get;set;}true;// 运行时启用/禁用}publicclassHardwareDevice{publicstringDeviceId{get;set;}string.Empty;publicstringName{get;set;}string.Empty;publicstringIpAddress{get;set;}string.Empty;publicintPort{get;set;}}publicclassConfigData{publicListStationConfigStations{get;set;}new();publicstringDefaultStationId{get;set;}B;}2. ServicesIConfigService.cspublicinterfaceIConfigService{ListStationConfigLoadStations();voidSaveStations(ListStationConfigstations);}ConfigService.cs关键加载您提供的 JSONpublicclassConfigService:IConfigService{privatereadonlystring_pathPath.Combine(AppDomain.CurrentDomain.BaseDirectory,stations.json);publicListStationConfigLoadStations(){if(!File.Exists(_path)){// 首次运行使用您提供的完整 JSON直接粘贴varjson{ Stations: [ ...您提供的完整 JSON Stations 数组... ], DefaultStationId: B };vardataJsonSerializer.DeserializeConfigData(json);returndata?.Stations??new();}varjsonTextFile.ReadAllText(_path);vardata2JsonSerializer.DeserializeConfigData(jsonText);returndata2?.Stations??new();}publicvoidSaveStations(ListStationConfigstations){vardatanewConfigData{Stationsstations,DefaultStationIdB};File.WriteAllText(_path,JsonSerializer.Serialize(data,newJsonSerializerOptions{WriteIndentedtrue}));}}CommunicationService.cs占位未来扩展publicclassCommunicationService:ICommunicationService{publicvoidInitializeStation(StationConfigconfig){// TODO: 根据 config.HardwareDevices 创建 Socket/Modbus 客户端// 例如MainBoard 192.168.1.10:5000}}3. ViewModelsStationViewModel.cs核心处理 E 站特殊逻辑publicclassStationViewModel:BindableBase{publicstringStationId{get;}publicstringName{get;}publicObservableCollectionHardwareDeviceHardwareDevices{get;}privatestring_statusOffline;publicstringStatus{get_status;setSetProperty(ref_status,value);}privatebool_isIdle;publicboolIsIdle{get_isIdle;setSetProperty(ref_isIdle,value);}// E 站专用publicstringControlButtonTextStationIdE?自动:关闭;publicBrushStatusBrushIsIdle?Brushes.DodgerBlue:Brushes.LightGray;// 测量值实时绑定publicdoubleIaRms{get;set;}// 绑定到右侧仪表// ... 其他 Ia-max, Temp, FlowRate, LiquidLevel 等全部属性 ...publicDelegateCommandControlCommand{get;}publicDelegateCommandBatchStartCommand{get;}publicDelegateCommandPrepareCommand{get;}publicDelegateCommandStopCommand{get;}publicDelegateCommandResetCommand{get;}publicStationViewModel(StationConfigconfig){StationIdconfig.StationId;Nameconfig.Name;HardwareDevicesnewObservableCollectionHardwareDevice(config.HardwareDevices);IsIdleconfig.StationIdE;StatusIsIdle?IDLE:Offline;ControlCommandnewDelegateCommand(ExecuteControl);// 其他 Command 类似}privatevoidExecuteControl(){// E 站 → 自动模式其他 → 关闭StatusStationIdE?IDLE:Offline;}}MainViewModel.cspublicclassMainViewModel:BindableBase{privatereadonlyIConfigService_configService;publicObservableCollectionStationViewModelAllStations{get;}new();publicObservableCollectionStationViewModelEnabledStations{get;privateset;}new();publicDelegateCommandOpenConfigCommand{get;}publicMainViewModel(IConfigServiceconfigService){_configServiceconfigService;LoadStations();OpenConfigCommandnewDelegateCommand((){/* 打开 ConfigurationDialog */});}privatevoidLoadStations(){varconfigs_configService.LoadStations();foreach(varcfginconfigs){AllStations.Add(newStationViewModel(cfg));}RefreshEnabledStations();}publicvoidToggleStation(stringstationId){varvmAllStations.FirstOrDefault(xx.StationIdstationId);if(vmnull)return;// 实际 IsEnabled 存在于 StationConfig 中这里简化直接切换RefreshEnabledStations();}privatevoidRefreshEnabledStations(){EnabledStationsnewObservableCollectionStationViewModel(AllStations.Where(xx.IsEnabled));// IsEnabled 可加到 VMRaisePropertyChanged(nameof(EnabledStations));}}4. ViewsXAML 完全复刻布局MainWindow.xaml三列 Grid完全匹配图片Windowx:ClassMaxwell.UI.Views.MainWindowxmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationTitleMaxwell-Pro TESTERHeight900Width1600GridGrid.ColumnDefinitionsColumnDefinitionWidth280/!-- 左侧导航 --ColumnDefinitionWidth620/!-- 中间测试站堆叠 --ColumnDefinitionWidth700/!-- 右侧 Tab仪表 --/Grid.ColumnDefinitions!-- 左侧导航栏完全复刻图片按钮 --local:NavigationMenuViewGrid.Column0DataContext{Binding}/!-- 中间测试站垂直堆叠 --ScrollViewerGrid.Column1VerticalScrollBarVisibilityAutoMargin5ItemsControlItemsSource{Binding EnabledStations}ItemsControl.ItemTemplateDataTemplatelocal:StationPanelViewMargin0,8,0,0//DataTemplate/ItemsControl.ItemTemplate/ItemsControl/ScrollViewer!-- 右侧 Tab 图表 仪表 --GridGrid.Column2Margin5TabControlItemsSource{Binding EnabledStations}TabControl.ItemTemplateDataTemplateTextBlockText{Binding Name}FontWeightSemiBold//DataTemplate/TabControl.ItemTemplateTabControl.ContentTemplateDataTemplatelocal:MeasurementDashboardView//DataTemplate/TabControl.ContentTemplate/TabControl!-- 汇总数据 Tab 可额外添加固定 TabItem --/Grid/Grid/WindowStationPanelView.xaml单个测试站面板完全复刻 A~F 站UserControlx:ClassMaxwell.UI.Views.StationPanelViewBorderBorderBrush#CCCCCCBorderThickness1CornerRadius4Padding8StackPanel!-- 站头 --GridTextBlockText{Binding Name}FontSize16FontWeightBold/BorderBackground{Binding StatusBrush}CornerRadius3HorizontalAlignmentRightPadding8,2TextBlockText{Binding Status}ForegroundWhiteFontWeightBold//Border/Grid!-- 数据路径、测试程序、封装类型、LOT ID、ID1~ID3 --UniformGridColumns4Margin0,8TextBlockText数据路径:/TextBoxText{Binding DataPath}IsReadOnlyTrue/!-- 其他字段同理 --/UniformGrid!-- 按钮区 --UniformGridColumns5Margin0,12,0,0ButtonContent{Binding ControlButtonText}Background{Binding StationId, Converter{StaticResource EStationConverter}}Command{Binding ControlCommand}/ButtonContent批次开始Command{Binding BatchStartCommand}/ButtonContent准备Command{Binding PrepareCommand}/ButtonContent停止Command{Binding StopCommand}/ButtonContent复位Command{Binding ResetCommand}//UniformGrid/StackPanel/Border/UserControlMeasurementDashboardView.xaml右侧仪表盘 图表 日志UserControl...Grid!-- 图表区OxyPlot 或 LiveCharts --oxy:PlotTitle有效电流 (A)Margin0,0,0,10!-- IA/IB/IC 三条线实时绑定 --/oxy:Plot!-- 测量值网格完全复刻图片 Ia-rms / DC Link / Temp / Liquid Level 等 --UniformGridColumns3Margin0,10!-- Ia-rms、Ib-rms、Ic-rms --!-- Ia-max、Ib-max、Ic-max --!-- DC Link / Power / Current --!-- T-a_H / T-b_H / T-c_H --!-- Rgon_H / Rgoff_H / Cge_H --!-- Temp / FlowRate / Pressure / Liquid Level --/UniformGrid!-- 日志区 --ListBoxItemsSource{Binding LogMessages}Height180Margin0,10,0,0//Grid/UserControlNavigationMenuView.xaml左侧按钮完全复刻图片使用ButtonCommand绑定MainViewModel中的对应命令。初始化流程App.xaml.cspublicpartialclassApp:PrismApplication{protectedoverridevoidRegisterTypes(IContainerRegistrycontainerRegistry){containerRegistry.RegisterSingletonIConfigService,ConfigService();containerRegistry.RegisterSingletonICommunicationService,CommunicationService();}protectedoverrideWindowCreateShell()Container.ResolveMainWindow();}启用/禁用逻辑在ConfigurationDialog中列出AllStations勾选IsEnabled→ 调用MainViewModel.ToggleStation()→RefreshEnabledStations()→ 中间面板和右侧 Tab 自动隐藏/显示。实时更新在StationViewModel中启动DispatcherTimer或通过CommunicationService事件推送测量值 →SetProperty自动刷新 UI。高度可扩展新增 G 站 → 只在stations.json增加一条 StationConfig 即可。禁用某站 → 配置管理里取消勾选即可。把以上代码直接复制到新 WPF Prism 项目中替换stations.json为您提供的完整 JSON即可100% 复刻主界面并满足所有 7 条需求。需要我继续提供ConfigurationDialog.xaml或OxyPlot波形绑定代码请告诉我

更多文章