添加项目文件。

This commit is contained in:
xyy
2026-06-13 14:16:34 +08:00
parent 9df508aa36
commit 3fb35f5814
23 changed files with 1251 additions and 0 deletions

50
Views/ConfigWindow.xaml Normal file
View File

@@ -0,0 +1,50 @@
<Window x:Class="AciTester.Views.ConfigWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="参数校准配置 - Ctrl+P" Height="450" Width="500"
WindowStartupLocation="CenterOwner">
<Grid Margin="10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<GroupBox Header="流量校准" Grid.Row="0">
<StackPanel Orientation="Horizontal" Margin="5">
<TextBlock Text="流量系数:" Width="80" VerticalAlignment="Center"/>
<TextBox Text="{Binding Calibration.FlowCalibration}" Width="100"/>
<TextBlock Text=" 保护低限:" Margin="20,0,0,0"/>
<TextBox Text="{Binding Calibration.FlowLowLimit}" Width="80"/>
<TextBlock Text="高限:" Margin="5,0,0,0"/>
<TextBox Text="{Binding Calibration.FlowHighLimit}" Width="80"/>
</StackPanel>
</GroupBox>
<GroupBox Header="温度校准" Grid.Row="1" Margin="0,10">
<StackPanel Orientation="Horizontal" Margin="5">
<TextBlock Text="温度系数:" Width="80"/>
<TextBox Text="{Binding Calibration.TemperatureCalibration}" Width="100"/>
</StackPanel>
</GroupBox>
<GroupBox Header="压力校准(泵端)" Grid.Row="2">
<StackPanel Orientation="Horizontal" Margin="5">
<TextBlock Text="泵端压力系数:" Width="120"/>
<TextBox Text="{Binding Calibration.PumpPressureCalibration}" Width="100"/>
</StackPanel>
</GroupBox>
<GroupBox Header="压力校准(撞击器端)" Grid.Row="3" Margin="0,10">
<StackPanel Orientation="Horizontal" Margin="5">
<TextBlock Text="撞击器端压力系数:" Width="140"/>
<TextBox Text="{Binding Calibration.ImpactorPressureCalibration}" Width="100"/>
</StackPanel>
</GroupBox>
<StackPanel Grid.Row="4" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,10">
<Button Command="{Binding LoadConfigCommand}" Content="读取" Width="80" Margin="5"/>
<Button Command="{Binding SaveConfigCommand}" Content="保存" Width="80" Margin="5"/>
<Button Click="CloseWindow" Content="关闭" Width="80" Margin="5"/>
</StackPanel>
</Grid>
</Window>

View File

@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace AciTester.Views
{
/// <summary>
/// ConfigWindow.xaml 的交互逻辑
/// </summary>
public partial class ConfigWindow : Window
{
public ConfigWindow()
{
InitializeComponent();
}
private void CloseWindow(object sender, RoutedEventArgs e)
{
this.Close();
}
}
}

144
Views/MainWindow.xaml Normal file
View File

@@ -0,0 +1,144 @@
<Window x:Class="AciTester.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:AciTester.ViewModels"
Title="ACI测试系统 - 中国药典2025装置3"
Height="768" Width="1024"
WindowStartupLocation="CenterScreen">
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Grid Margin="10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- 状态栏 (Row 0) -->
<StatusBar Grid.Row="0">
<StatusBarItem>
<TextBlock Text="状态:"/>
</StatusBarItem>
<StatusBarItem>
<TextBlock Text="{Binding ConnectionStatus}" Foreground="{Binding IsConnected, Converter={StaticResource BoolToColorConverter}}"/>
</StatusBarItem>
<Separator/>
<StatusBarItem>
<TextBlock Text="流量:"/>
</StatusBarItem>
<StatusBarItem>
<TextBlock Text="{Binding CurrentFlow, StringFormat='{}{0:F2} L/min'}"/>
</StatusBarItem>
<Separator/>
<StatusBarItem>
<TextBlock Text="泵状态:"/>
</StatusBarItem>
<StatusBarItem>
<TextBlock Text="{Binding IsPumpRunning, Converter={StaticResource BoolToStringConverter}}"/>
</StatusBarItem>
<Separator/>
<StatusBarItem>
<TextBlock Text="倒计时:" Visibility="{Binding IsTesting, Converter={StaticResource BoolToVisibilityConverter}}"/>
</StatusBarItem>
<StatusBarItem>
<TextBlock Text="{Binding RemainingSeconds, StringFormat='{}{0} s'}" Visibility="{Binding IsTesting, Converter={StaticResource BoolToVisibilityConverter}}"/>
</StatusBarItem>
</StatusBar>
<!-- 实时监测参数 (Row 1) -->
<GroupBox Header="实时监测参数" Grid.Row="1" Margin="0,5">
<StackPanel>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Orientation="Vertical">
<TextBlock Text="流量 (L/min)" FontWeight="Bold"/>
<TextBlock Text="{Binding RealTime.CalibratedFlow, StringFormat='{}{0:F2}'}" FontSize="18" Foreground="Blue"/>
<TextBlock Text="(目标: 28.3)" FontSize="10" Foreground="Gray"/>
</StackPanel>
<StackPanel Grid.Column="1" Orientation="Vertical">
<TextBlock Text="温度 (℃)" FontWeight="Bold"/>
<TextBlock Text="{Binding RealTime.Temperature, StringFormat='{}{0:F1}'}" FontSize="18"/>
</StackPanel>
<StackPanel Grid.Column="2" Orientation="Vertical">
<TextBlock Text="泵端压力 (kPa)" FontWeight="Bold"/>
<TextBlock Text="{Binding RealTime.PumpPressure, StringFormat='{}{0:F2}'}" FontSize="18"/>
</StackPanel>
<StackPanel Grid.Column="3" Orientation="Vertical">
<TextBlock Text="撞击器端压力 (kPa)" FontWeight="Bold"/>
<TextBlock Text="{Binding RealTime.ImpactorPressure, StringFormat='{}{0:F2}'}" FontSize="18"/>
</StackPanel>
</Grid>
<Separator Margin="0,5"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<TextBlock Text="压差: " FontWeight="Bold"/>
<TextBlock Text="{Binding RealTime.DifferentialPressure, StringFormat='{}{0:F2} kPa'}" Foreground="DarkRed"/>
</StackPanel>
</StackPanel>
</GroupBox>
<!-- 主内容 (Row 2) -->
<Grid Grid.Row="2" Margin="0,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*"/>
<ColumnDefinition Width="3*"/>
</Grid.ColumnDefinitions>
<!-- 左侧控制区 -->
<StackPanel Grid.Column="0" Margin="5">
<GroupBox Header="通讯控制">
<StackPanel>
<Button Command="{Binding ConnectCommand}" Content="连接PLC" Width="100" Margin="5"/>
<Button Command="{Binding DisconnectCommand}" Content="断开连接" Width="100" Margin="5"/>
</StackPanel>
</GroupBox>
<GroupBox Header="采样参数" Margin="0,10">
<StackPanel>
<StackPanel Orientation="Horizontal" Margin="5">
<TextBlock Text="采样时间(秒):" VerticalAlignment="Center" Width="100"/>
<TextBox Text="{Binding SampleTimeSeconds}" Width="60" IsEnabled="{Binding IsTesting, Converter={StaticResource InverseBoolConverter}}"/>
</StackPanel>
<Button Command="{Binding StartTestCommand}" Content="开始测试" Width="100" Margin="5"
IsEnabled="{Binding IsTesting, Converter={StaticResource InverseBoolConverter}}"/>
<TextBlock Text="测试进行中..." Visibility="{Binding IsTesting, Converter={StaticResource BoolToVisibilityConverter}}"/>
</StackPanel>
</GroupBox>
<GroupBox Header="数据分析">
<StackPanel>
<Button Command="{Binding CalculateCommand}" Content="计算结果" Width="100" Margin="5"/>
<Button Command="{Binding ExportReportCommand}" Content="导出报告" Width="100" Margin="5"/>
</StackPanel>
</GroupBox>
</StackPanel>
<!-- 右侧称重数据表格 -->
<ScrollViewer Grid.Column="1" VerticalScrollBarVisibility="Auto">
<DataGrid ItemsSource="{Binding Stages}" AutoGenerateColumns="False" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="层级" Binding="{Binding StageName}" IsReadOnly="True"/>
<DataGridTextColumn Header="截止直径(μm)" Binding="{Binding CutoffDiameter, StringFormat='{}{0:F1}'}" IsReadOnly="True"/>
<DataGridTextColumn Header="测前质量(g)" Binding="{Binding InitialWeight, StringFormat='{}{0:F4}'}"/>
<DataGridTextColumn Header="测后质量(g)" Binding="{Binding FinalWeight, StringFormat='{}{0:F4}'}"/>
<DataGridTextColumn Header="净重(g)" Binding="{Binding NetWeight, StringFormat='{}{0:F6}'}" IsReadOnly="True"/>
</DataGrid.Columns>
</DataGrid>
</ScrollViewer>
</Grid>
<!-- 结果显示 (Row 3) -->
<Border Grid.Row="3" BorderBrush="Gray" BorderThickness="1" Margin="0,5,0,0" Padding="5">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<TextBlock Text="微细粒子剂量(FPD): " FontWeight="Bold"/>
<TextBlock Text="{Binding CurrentResult.FineParticleDose, StringFormat='{}{0:F2} mg'}" Margin="5,0,20,0"/>
<TextBlock Text="微细粒子分数(FPF): " FontWeight="Bold"/>
<TextBlock Text="{Binding CurrentResult.FineParticleFraction, StringFormat='{}{0:F2} %'}"/>
</StackPanel>
</Border>
</Grid>
</Window>

43
Views/MainWindow.xaml.cs Normal file
View File

@@ -0,0 +1,43 @@
using AciTester.ViewModels;
using CommunityToolkit.Mvvm.Input;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace AciTester.Views
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Loaded += (s, e) =>
{
var keyGesture = new KeyGesture(Key.P, ModifierKeys.Control);
var inputBinding = new InputBinding(
new RelayCommand(OpenConfigWindow),
keyGesture);
this.InputBindings.Add(inputBinding);
};
}
private void OpenConfigWindow()
{
var vm = (MainViewModel)this.DataContext;
var configVm = new ConfigViewModel(vm._plcService, vm._config, vm.Calibration);
var win = new ConfigWindow { DataContext = configVm, Owner = this };
win.ShowDialog();
}
}
}