基于 WPF 和 Prism 框架的完整代码示例
·
这是一个基于 WPF 和 Prism 框架的完整代码示例。
这个示例包含了 Model(模型)、ViewModel(视图模型) 和 View(视图/XAML) 三部分。为了保持代码结构清晰,我使用了 CommunityToolkit.Mvvm(即 Microsoft.Toolkit.Mvvm)作为 Prism 推荐的轻量级 MVVM 辅助库,当然你也可以使用 Prism 自带的 BindableBase。
1. 数据模型
首先,我们需要定义数据模型来承载界面上的参数。
// Models/TestParameters.cs
using CommunityToolkit.Mvvm.ComponentModel;
namespace MaxWell.Models
{
// 模温机参数
public class TempControlParams : ObservableObject
{
private double _temp = 65.0;
private double _flowRate = 8.0;
private int _drainTime = 10;
public double Temp { get => _temp; set => SetProperty(ref _temp, value); }
public double FlowRate { get => _flowRate; set => SetProperty(ref _flowRate, value); }
public int DrainTime { get => _drainTime; set => SetProperty(ref _drainTime, value); }
}
// 流程测试参数
public class ProcessTestParams : ObservableObject
{
public double PeakCurrentLimit { get; set; } = 750;
public double UnbalanceLimit { get; set; } = 10;
public double ModuleTempUpper { get; set; } = 100;
public double CopperBarTempLimit { get; set; } = 100;
public double Busbar1Current { get; set; } = 100;
public double OutputJudge { get; set; } = 10;
// 死区时间
public double DeadTime { get; set; } = 4.0;
public double UnbalanceCurrent { get; set; } = 20;
public double ModuleTempLower { get; set; } = 0;
public double OutputCurrentUpper { get; set; } = 500;
public double Busbar2Current { get; set; } = 500;
public double OutputJudgeCurrent { get; set; } = 20;
}
// 辅助参数
public class AuxiliaryParams : ObservableObject
{
public double SampleInterval { get; set; } = 0.1;
public string PackageType { get; set; } = "HybirdPACKDrive-003";
public bool ScanOnLoad { get; set; } = true;
public int工位Count { get; set; } = 2; // 工位载盘数
public int SweepTime { get; set; } = 60;
public bool ScanOnUnload { get; set; } = false;
}
// 栅极参数 (Gate Params)
public class GateParams : ObservableObject
{
public double VgeOnH { get; set; } = 16;
public double VgeOnL { get; set; } = 16;
public double RgonH { get; set; } = 8.20;
public double RgonL { get; set; } = 8.20;
public double CgeH { get; set; } = 0.000;
public double VgeOffH { get; set; } = -8;
public double VgeOffL { get; set; } = -8;
public double RgoffH { get; set; } = 6.80;
public double RgoffL { get; set; } = 6.80;
public double CgeL { get; set; } = 0.000;
}
// 测试流程步骤
public class ProcessStep : ObservableObject
{
public string Name { get; set; } // 如:基波频率切换点
public double Target { get; set; }
public double AccDecTime { get; set; }
public double HoldTime { get; set; }
public int Loops { get; set; }
}
}
2. ViewModel
这是核心逻辑部分,处理命令和属性绑定。
// ViewModels/BatchStartViewModel.cs
using MaxWell.Models;
using Prism.Commands;
using Prism.Mvvm;
using System.Collections.ObjectModel;
using System.Windows;
namespace MaxWell.ViewModels
{
public class BatchStartViewModel : BindableBase
{
// 基础信息
public string TesterId { get; set; } = "administrator";
public string SavePath { get; set; } = @"D:\RecordData";
public string LotId { get; set; }
// 下拉框选项模拟
public ObservableCollection<string> ConfigOptions { get; set; }
private string _selectedConfig;
public string SelectedConfig
{
get => _selectedConfig;
set => SetProperty(ref _selectedConfig, value);
}
// 分组参数对象
public TempControlParams TempParams { get; set; }
public ProcessTestParams ProcessParams { get; set; }
public AuxiliaryParams AuxParams { get; set; }
public GateParams GateParams { get; set; }
// 流程列表
public ObservableCollection<ProcessStep> ProcessSteps { get; set; }
// 命令
public DelegateCommand<string> SyncCommand { get; private set; }
public DelegateCommand ExitCommand { get; private set; }
public DelegateCommand ConfirmCommand { get; private set; }
public DelegateCommand BrowsePathCommand { get; private set; }
public BatchStartViewModel()
{
// 初始化数据
TempParams = new TempControlParams();
ProcessParams = new ProcessTestParams();
AuxParams = new AuxiliaryParams();
GateParams = new GateParams();
// 初始化配置选项
ConfigOptions = new ObservableCollection<string> { "MP_HD1 - 调试", "MP_HD2 - 量产", "MP_HD3 - 老化" };
SelectedConfig = ConfigOptions[0];
// 初始化流程步骤数据 (模拟截图中的数据)
ProcessSteps = new ObservableCollection<ProcessStep>
{
new ProcessStep { Name = "基波频率切换点", Target = 250, AccDecTime = 1, HoldTime = 0, Loops = 1 },
new ProcessStep { Name = "载波频率切换点", Target = 7000, AccDecTime = 1, HoldTime = 0, Loops = 0 },
new ProcessStep { Name = "母线电压切换点", Target = 480, AccDecTime = 500, HoldTime = 50, Loops = 0 },
new ProcessStep { Name = "AC测试切换点", Target = 0, AccDecTime = 1, HoldTime = 0, Loops = 1 },
new ProcessStep { Name = "电流工况", Target = 0, AccDecTime = 1, HoldTime = 1, Loops = 1 },
new ProcessStep { Name = "电流工况", Target = 10, AccDecTime = 0.1, HoldTime = 0.5, Loops = 1 },
new ProcessStep { Name = "电流工况", Target = 0, AccDecTime = 0.1, HoldTime = 1, Loops = 0 },
new ProcessStep { Name = "电流工况", Target = 450, AccDecTime = 0.1, HoldTime = 3, Loops = 0 },
new ProcessStep { Name = "电流工况", Target = 0, AccDecTime = 0.1, HoldTime = 2, Loops = 0 },
new ProcessStep { Name = "NC", Target = 0, AccDecTime = 0, HoldTime = 0, Loops = 1 },
};
// 初始化命令
SyncCommand = new DelegateCommand<string>(OnSync);
ExitCommand = new DelegateCommand(OnExit);
ConfirmCommand = new DelegateCommand(OnConfirm);
BrowsePathCommand = new DelegateCommand(() => {
MessageBox.Show("这里调用FolderBrowserDialog选择路径");
});
}
private void OnSync(string param)
{
// param 将传入 "A", "B", "C" 等
MessageBox.Show($"正在同步通道: {param}");
// TODO: 实际同步逻辑
}
private void OnExit()
{
// Prism 中通常通过 EventAggregator 或者 IRegionManager 关闭窗口
// 这里简单模拟
if (MessageBox.Show("确定退出吗?", "提示", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
{
// Application.Current.Shutdown();
}
}
private void OnConfirm()
{
MessageBox.Show("参数已确认保存!");
// TODO: 保存逻辑
}
}
}
3. View (XAML)
这是 UI 界面代码。为了还原截图的样式,使用了 Grid 布局,GroupBox 进行分组,以及 DataGrid 显示流程列表。
<!-- Views/BatchStartView.xaml -->
<Window x:Class="MaxWell.Views.BatchStartView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:prism="http://prismlibrary.com/"
mc:Ignorable="d"
Title="批次参数加载" Height="900" Width="1200"
Background="#F0F0F0"
FontFamily="Microsoft YaHei">
<Grid Margin="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*"/> <!-- 左侧主要参数 -->
<ColumnDefinition Width="1*"/> <!-- 右侧按钮和流程 -->
</Grid.ColumnDefinitions>
<!-- 左侧主区域 -->
<ScrollViewer Grid.Column="0" Margin="0,0,10,0" VerticalScrollBarVisibility="Auto">
<StackPanel>
<!-- 顶部基本信息 -->
<Grid Margin="0,0,0,15">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="测试人员编号" VerticalAlignment="Center" FontWeight="Bold"/>
<TextBox Grid.Column="1" Text="{Binding TesterId}" Margin="5,0" IsEnabled="False" Background="#E0E0E0"/>
<TextBlock Grid.Row="1" Text="数据保存路径" VerticalAlignment="Center" FontWeight="Bold" Margin="0,10,0,0"/>
<Grid Grid.Row="1" Grid.Column="1" Margin="5,10,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBox Text="{Binding SavePath}" Margin="0,0,5,0"/>
<Button Grid.Column="1" Content="..." Width="30" Command="{Binding BrowsePathCommand}"/>
</Grid>
<TextBlock Grid.Row="2" Text="LOT ID" VerticalAlignment="Center" FontWeight="Bold" Margin="0,10,0,0"/>
<TextBox Grid.Row="2" Grid.Column="1" Text="{Binding LotId}" Margin="5,10,0,0"/>
<TextBlock Grid.Row="3" Text="配置选择" VerticalAlignment="Center" FontWeight="Bold" Margin="0,10,0,0"/>
<ComboBox Grid.Row="3" Grid.Column="1" ItemsSource="{Binding ConfigOptions}"
SelectedItem="{Binding SelectedConfig}" Margin="5,10,0,0" Height="25"/>
</Grid>
<!-- 1. 模温机参数 -->
<GroupBox Header="模温机参数" FontWeight="Bold" Padding="10" Margin="0,0,0,10">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="模温机温度" Width="80"/>
<TextBox Text="{Binding TempParams.Temp}" Width="60"/>
<TextBlock Text="°C" VerticalAlignment="Center" Margin="5,0,0,0"/>
</StackPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="模温机流速" Width="80"/>
<TextBox Text="{Binding TempParams.FlowRate}" Width="60"/>
<TextBlock Text="L/min" VerticalAlignment="Center" Margin="5,0,0,0"/>
</StackPanel>
<StackPanel Grid.Column="2" Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="水冷板排水时间" Width="100"/>
<TextBox Text="{Binding TempParams.DrainTime}" Width="60"/>
<TextBlock Text="s" VerticalAlignment="Center" Margin="5,0,0,0"/>
</StackPanel>
</Grid>
</GroupBox>
<!-- 2. 流程测试参数 -->
<GroupBox Header="流程测试参数" FontWeight="Bold" Padding="10" Margin="0,0,0,10">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- 第一行 -->
<StackPanel Grid.Column="0" Orientation="Horizontal" Margin="0,5">
<TextBlock Text="相峰值过流点" Width="90"/>
<TextBox Text="{Binding ProcessParams.PeakCurrentLimit}" Width="60"/>
<TextBlock Text="A" VerticalAlignment="Center"/>
</StackPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal" Margin="0,5">
<TextBlock Text="三相不平衡度" Width="90"/>
<TextBox Text="{Binding ProcessParams.UnbalanceLimit}" Width="60"/>
<TextBlock Text="%" VerticalAlignment="Center"/>
</StackPanel>
<StackPanel Grid.Column="2" Orientation="Horizontal" Margin="0,5">
<TextBlock Text="模块温度上限" Width="90"/>
<TextBox Text="{Binding ProcessParams.ModuleTempUpper}" Width="60"/>
<TextBlock Text="°C" VerticalAlignment="Center"/>
</StackPanel>
<!-- 第二行 -->
<StackPanel Grid.Column="0" Grid.Row="1" Orientation="Horizontal" Margin="0,5">
<TextBlock Text="死区时间" Width="90"/>
<TextBox Text="{Binding ProcessParams.DeadTime}" Width="60"/>
<TextBlock Text="μs" VerticalAlignment="Center"/>
</StackPanel>
<StackPanel Grid.Column="1" Grid.Row="1" Orientation="Horizontal" Margin="0,5">
<TextBlock Text="三相不平衡度" Width="90"/>
<TextBox Text="{Binding ProcessParams.UnbalanceCurrent}" Width="60"/>
<TextBlock Text="A" VerticalAlignment="Center"/>
</StackPanel>
<StackPanel Grid.Column="2" Grid.Row="1" Orientation="Horizontal" Margin="0,5">
<TextBlock Text="模块温度下限" Width="90"/>
<TextBox Text="{Binding ProcessParams.ModuleTempLower}" Width="60"/>
<TextBlock Text="°C" VerticalAlignment="Center"/>
</StackPanel>
</Grid>
</GroupBox>
<!-- 3. 辅助参数 -->
<GroupBox Header="辅助参数" FontWeight="Bold" Padding="10" Margin="0,0,0,10">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Text="数据采集间隔" VerticalAlignment="Center"/>
<StackPanel Grid.Column="1" Orientation="Horizontal" Margin="5,0">
<TextBox Text="{Binding AuxParams.SampleInterval}" Width="60"/>
<TextBlock Text="s" VerticalAlignment="Center" Margin="5,0"/>
</StackPanel>
<TextBlock Grid.Row="1" Text="封装类型" VerticalAlignment="Center" Margin="0,5"/>
<ComboBox Grid.Row="1" Grid.Column="1" Text="{Binding AuxParams.PackageType}" Margin="5,5" IsEditable="True"/>
<TextBlock Grid.Column="2" Text="上料自动扫码" VerticalAlignment="Center"/>
<StackPanel Grid.Column="3" Orientation="Horizontal" Margin="5,0">
<TextBlock Text="ON" Foreground="Green" FontWeight="Bold" Margin="0,0,5,0"/>
<ToggleButton IsChecked="{Binding AuxParams.ScanOnLoad}" Width="50" Height="20"/>
</StackPanel>
<TextBlock Grid.Row="1" Grid.Column="2" Text="下料自动扫码" VerticalAlignment="Center" Margin="0,5"/>
<StackPanel Grid.Row="1" Grid.Column="3" Orientation="Horizontal" Margin="5,5">
<TextBlock Text="OFF" Foreground="Gray" FontWeight="Bold" Margin="0,0,5,0"/>
<ToggleButton IsChecked="{Binding AuxParams.ScanOnUnload}" Width="50" Height="20"/>
</StackPanel>
</Grid>
</GroupBox>
<!-- 4. 栅极参数 -->
<GroupBox Header="栅极参数" FontWeight="Bold" Padding="10" Margin="0,0,0,10">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- 这里只展示了部分,实际可复制更多 -->
<StackPanel Grid.Column="0" Margin="0,2">
<TextBlock Text="V_Geon_H" FontWeight="Bold"/>
<TextBox Text="{Binding GateParams.VgeOnH}"/>
</StackPanel>
<StackPanel Grid.Column="1" Margin="0,2">
<TextBlock Text="V_Geon_L" FontWeight="Bold"/>
<TextBox Text="{Binding GateParams.VgeOnL}"/>
</StackPanel>
<StackPanel Grid.Column="2" Margin="0,2">
<TextBlock Text="R_gon_H" FontWeight="Bold"/>
<TextBox Text="{Binding GateParams.RgonH}"/>
</StackPanel>
<StackPanel Grid.Column="0" Grid.Row="1" Margin="0,2">
<TextBlock Text="V_Geoff_H" FontWeight="Bold"/>
<TextBox Text="{Binding GateParams.VgeOffH}"/>
</StackPanel>
<StackPanel Grid.Column="1" Grid.Row="1" Margin="0,2">
<TextBlock Text="V_Geoff_L" FontWeight="Bold"/>
<TextBox Text="{Binding GateParams.VgeOffL}"/>
</StackPanel>
<StackPanel Grid.Column="2" Grid.Row="1" Margin="0,2">
<TextBlock Text="R_goff_H" FontWeight="Bold"/>
<TextBox Text="{Binding GateParams.RgoffH}"/>
</StackPanel>
</Grid>
</GroupBox>
</StackPanel>
</ScrollViewer>
<!-- 右侧区域 -->
<Grid Grid.Column="1">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/> <!-- 按钮区 -->
<RowDefinition Height="*"/> <!-- 流程设置 -->
<RowDefinition Height="2*"/> <!-- 图表预览 -->
</Grid.RowDefinitions>
<!-- 顶部按钮 -->
<StackPanel Grid.Row="0" Orientation="Vertical" Spacing="5">
<UniformGrid Columns="1">
<Button Content="A 同步" Background="#4A6FA5" Foreground="White" FontWeight="Bold" Height="40"
Command="{Binding SyncCommand}" CommandParameter="A"/>
<Button Content="B 同步" Background="#4A6FA5" Foreground="White" FontWeight="Bold" Height="40"
Command="{Binding SyncCommand}" CommandParameter="B"/>
<Button Content="C 同步" Background="#4A6FA5" Foreground="White" FontWeight="Bold" Height="40"
Command="{Binding SyncCommand}" CommandParameter="C"/>
<Button Content="退出" Background="#888" Foreground="White" FontWeight="Bold" Height="40"
Command="{Binding ExitCommand}"/>
</UniformGrid>
<UniformGrid Columns="1" Margin="0,10,0,0">
<Button Content="D 同步" Background="#4A6FA5" Foreground="White" FontWeight="Bold" Height="40"/>
<Button Content="E 同步" Background="#5C9EFF" Foreground="White" FontWeight="Bold" Height="40"/>
<Button Content="F 同步" Background="#4A6FA5" Foreground="White" FontWeight="Bold" Height="40"/>
<Button Content="确定" Background="#5C9EFF" Foreground="White" FontWeight="Bold" Height="40"
Command="{Binding ConfirmCommand}"/>
</UniformGrid>
</StackPanel>
<!-- 测试流程设置 (DataGrid) -->
<GroupBox Grid.Row="1" Header="测试流程设置" FontWeight="Bold" Margin="0,10,0,10" Padding="5">
<DataGrid ItemsSource="{Binding ProcessSteps}" AutoGenerateColumns="False"
CanUserAddRows="False" HeadersVisibility="Column" GridLinesVisibility="Horizontal">
<DataGrid.Columns>
<DataGridTextColumn Header="工步设置" Binding="{Binding Name}" Width="*"/>
<DataGridTextColumn Header="目标参数" Binding="{Binding Target}" Width="*"/>
<DataGridTextColumn Header="加减速时间(s)" Binding="{Binding AccDecTime}" Width="*"/>
<DataGridTextColumn Header="保持时间(s)" Binding="{Binding HoldTime}" Width="*"/>
<DataGridTextColumn Header="循环次数" Binding="{Binding Loops}" Width="*"/>
</DataGrid.Columns>
</DataGrid>
</GroupBox>
<!-- 图表预览 (模拟) -->
<GroupBox Grid.Row="2" Header="测试电流预览" FontWeight="Bold" Padding="5">
<!-- 这里通常放置图表控件,如 LiveCharts 或 OxyPlot -->
<!-- 这里用一个 Border 模拟图表外观 -->
<Border Background="#333" CornerRadius="5">
<Grid>
<TextBlock Text="电流(A)" Foreground="White" VerticalAlignment="Top" Margin="10"/>
<TextBlock Text="时间(s)" Foreground="White" VerticalAlignment="Bottom" HorizontalAlignment="Right" Margin="10"/>
<!-- 简单的线条模拟波形 -->
<Path Data="M0,100 L100,100 L100,20 L200,20 L200,100 L300,100"
Stroke="LightBlue" StrokeThickness="2" Stretch="Fill" Margin="20"/>
</Grid>
</Border>
</GroupBox>
</Grid>
</Grid>
</Window>
代码说明
-
布局结构 (
Grid):- 主窗口分为左右两列。左侧占据大部分宽度,用于显示密集的参数输入框;右侧用于操作按钮和流程监控。
- 左侧使用了
ScrollViewer包裹StackPanel,确保当屏幕较小时,用户可以滚动查看所有参数。 - 右侧使用了
UniformGrid来整齐排列“同步”按钮,使其宽度一致。
-
数据绑定 (
Binding):- 所有的
TextBox.Text都绑定了 ViewModel 中的属性(例如{Binding TempParams.Temp})。 - 按钮的点击事件通过
ICommand绑定(例如Command="{Binding SyncCommand}"),符合 MVVM 模式,避免了在代码后置文件(.xaml.cs)中写逻辑。
- 所有的
-
样式 (
Style):- 为了接近截图的工业风格,按钮使用了深蓝灰色背景 (
#4A6FA5) 和白色文字。 GroupBox用于对参数进行逻辑分组(如“模温机参数”、“辅助参数”)。
- 为了接近截图的工业风格,按钮使用了深蓝灰色背景 (
-
依赖注入:
- 在实际的 Prism 应用程序中,你需要确保在
App.xaml.cs或模块初始化中注册了BatchStartView和BatchStartViewModel的映射关系。
- 在实际的 Prism 应用程序中,你需要确保在
这段代码提供了一个完整的框架,你可以直接将其复制到你的 Prism 项目中,并根据实际需求调整具体的业务逻辑(如保存文件、硬件通信等)。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)