Files
Z173/Views/MainWindow.xaml
2026-06-16 17:48:24 +08:00

284 lines
18 KiB
XML

<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"
Background="#F0F2F5">
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Window.Resources>
<!-- 按钮样式 -->
<Style TargetType="Button">
<Setter Property="Height" Value="40"/>
<Setter Property="Margin" Value="5"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Background" Value="#2C7DA0"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="BorderBrush" Value="#1F5E7A"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Cursor" Value="Hand"/>
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" Value="#CCCCCC"/>
<Setter Property="Foreground" Value="#666666"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#1F5E7A"/>
</Trigger>
</Style.Triggers>
</Style>
<!-- 文本框样式 -->
<Style TargetType="TextBox">
<Setter Property="Height" Value="35"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="BorderBrush" Value="#CCCCCC"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Padding" Value="5"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>
<!-- 切换按钮样式 -->
<Style TargetType="ToggleButton">
<Setter Property="Height" Value="40"/>
<Setter Property="Width" Value="80"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Background" Value="#E74C3C"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Cursor" Value="Hand"/>
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Background" Value="#27AE60"/>
</Trigger>
</Style.Triggers>
</Style>
<!-- DataGrid 样式 -->
<Style TargetType="DataGrid">
<Setter Property="FontSize" Value="13"/>
<Setter Property="RowHeight" Value="30"/>
<Setter Property="HeadersVisibility" Value="Column"/>
<Setter Property="GridLinesVisibility" Value="Horizontal"/>
<Setter Property="AlternatingRowBackground" Value="#F9F9F9"/>
</Style>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Height" Value="35"/>
<Setter Property="Background" Value="#E9F0F5"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
</Style>
<Style TargetType="DataGridCell">
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
</Style>
</Window.Resources>
<Grid Margin="15">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- 状态栏 (Row 0) -->
<Border Grid.Row="0" Background="#2C3E50" CornerRadius="5" Padding="10" Margin="0,0,0,10">
<StackPanel Orientation="Horizontal">
<TextBlock Text="状态:" Foreground="White" FontSize="14" VerticalAlignment="Center"/>
<TextBlock Text="{Binding ConnectionStatus}" Foreground="{Binding IsConnected, Converter={StaticResource BoolToColorConverter}}" FontSize="14" FontWeight="Bold" Margin="5,0,20,0"/>
<Separator Background="White" Width="1" Margin="5,0"/>
<TextBlock Text="流量:" Foreground="White" FontSize="14" Margin="15,0,0,0"/>
<TextBlock Text="{Binding CurrentFlow, StringFormat='{}{0:F2} L/min'}" Foreground="White" FontSize="14" FontWeight="Bold" Margin="5,0,20,0"/>
<Separator Background="White" Width="1" Margin="5,0"/>
<TextBlock Text="泵状态:" Foreground="White" FontSize="14" Margin="15,0,0,0"/>
<TextBlock Text="{Binding IsPumpRunning, Converter={StaticResource BoolToStringConverter}}" Foreground="White" FontSize="14" FontWeight="Bold" Margin="5,0,20,0"/>
<Separator Background="White" Width="1" Margin="5,0"/>
<TextBlock Text="倒计时:" Foreground="White" FontSize="14" Margin="15,0,0,0" Visibility="{Binding IsTesting, Converter={StaticResource BoolToVisibilityConverter}}"/>
<TextBlock Text="{Binding RemainingSeconds, StringFormat='{}{0} s'}" Foreground="Orange" FontSize="14" FontWeight="Bold" Margin="5,0,0,0" Visibility="{Binding IsTesting, Converter={StaticResource BoolToVisibilityConverter}}"/>
</StackPanel>
</Border>
<!-- 实时监测参数 (Row 1) -->
<GroupBox Header="实时监测参数" Grid.Row="1" Margin="0,5" FontWeight="Bold" FontSize="14">
<StackPanel Margin="10">
<Grid Margin="0,5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" Background="#E3F2FD" CornerRadius="8" Padding="10" Margin="5">
<StackPanel>
<TextBlock Text="流量 (L/min)" FontWeight="Bold" FontSize="14" TextAlignment="Center"/>
<TextBlock Text="{Binding RealTime.CalibratedFlow, StringFormat='{}{0:F2}'}" FontSize="28" Foreground="#1565C0" TextAlignment="Center"/>
<TextBlock Text="(目标: 28.3)" FontSize="12" Foreground="Gray" TextAlignment="Center"/>
</StackPanel>
</Border>
<Border Grid.Column="1" Background="#FFF3E0" CornerRadius="8" Padding="10" Margin="5">
<StackPanel>
<TextBlock Text="温度 (℃)" FontWeight="Bold" FontSize="14" TextAlignment="Center"/>
<TextBlock Text="{Binding RealTime.Temperature, StringFormat='{}{0:F1}'}" FontSize="28" Foreground="#E65100" TextAlignment="Center"/>
</StackPanel>
</Border>
<Border Grid.Column="2" Background="#E8F5E9" CornerRadius="8" Padding="10" Margin="5">
<StackPanel>
<TextBlock Text="泵端压力 (kPa)" FontWeight="Bold" FontSize="14" TextAlignment="Center"/>
<TextBlock Text="{Binding RealTime.PumpPressure, StringFormat='{}{0:F2}'}" FontSize="28" Foreground="#2E7D32" TextAlignment="Center"/>
</StackPanel>
</Border>
<Border Grid.Column="3" Background="#FCE4EC" CornerRadius="8" Padding="10" Margin="5">
<StackPanel>
<TextBlock Text="撞击器端压力 (kPa)" FontWeight="Bold" FontSize="14" TextAlignment="Center"/>
<TextBlock Text="{Binding RealTime.ImpactorPressure, StringFormat='{}{0:F2}'}" FontSize="28" Foreground="#C2185B" TextAlignment="Center"/>
</StackPanel>
</Border>
</Grid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,10">
<TextBlock Text="压差: " FontWeight="Bold" FontSize="16"/>
<TextBlock Text="{Binding RealTime.DifferentialPressure, StringFormat='{}{0:F2} kPa'}" FontSize="16" FontWeight="Bold" Foreground="#D32F2F"/>
</StackPanel>
</StackPanel>
</GroupBox>
<!-- 空调与除霜控制 (Row 2) -->
<GroupBox Header="空调与除霜控制" Grid.Row="2" Margin="0,5" FontWeight="Bold" FontSize="14">
<Grid Margin="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" Background="#FFF9C4" CornerRadius="8" Padding="10" Margin="5">
<StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,5">
<TextBlock Text="空调启动倒计时:" FontSize="14" Width="140" VerticalAlignment="Center"/>
<TextBlock Text="{Binding RealTime.AcStartupCountdown, StringFormat='{}{0} 秒'}" FontSize="24" FontWeight="Bold" Foreground="#F57C00"/>
</StackPanel>
<Separator Margin="0,10"/>
<StackPanel Orientation="Horizontal" Margin="0,5">
<TextBlock Text="恒温启动" Width="80" FontSize="14" VerticalAlignment="Center"/>
<ToggleButton IsChecked="{Binding RealTime.ConstantTempStart, Mode=TwoWay}"
Command="{Binding WriteConstantTempStartCommand}"
CommandParameter="{Binding IsChecked, RelativeSource={RelativeSource Self}}"
IsEnabled="{Binding ConstantTempStartEnabled}"/>
<TextBlock Text="(除霜时禁用)" FontSize="11" Foreground="Gray" Margin="10,0,0,0" VerticalAlignment="Center"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,5">
<TextBlock Text="除霜启动" Width="80" FontSize="14" VerticalAlignment="Center"/>
<ToggleButton IsChecked="{Binding RealTime.DefrostStart, Mode=TwoWay}"
Command="{Binding WriteDefrostStartCommand}"
CommandParameter="{Binding IsChecked, RelativeSource={RelativeSource Self}}"/>
<TextBlock Text="{Binding RealTime.DefrostStart, Converter={StaticResource BoolToYesNoConverter}}" Foreground="Red" FontWeight="Bold" Margin="10,0,0,0" VerticalAlignment="Center"/>
</StackPanel>
</StackPanel>
</Border>
<Border Grid.Column="1" Background="#E0F2F1" CornerRadius="8" Padding="10" Margin="5">
<StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,8">
<TextBlock Text="除霜温度设置(℃)" Width="130" FontSize="14" VerticalAlignment="Center"/>
<TextBox Text="{Binding RealTime.DefrostTempSet, UpdateSourceTrigger=LostFocus, Mode=TwoWay}" Width="100"/>
<TextBlock Text="(≤30)" FontSize="11" Foreground="Gray" Margin="5,0,0,0" VerticalAlignment="Center"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,8">
<TextBlock Text="除霜时间设置(秒)" Width="130" FontSize="14" VerticalAlignment="Center"/>
<TextBox Text="{Binding RealTime.DefrostTimeSet, UpdateSourceTrigger=LostFocus, Mode=TwoWay}" Width="100"/>
<TextBlock Text="(≤180)" FontSize="11" Foreground="Gray" Margin="5,0,0,0" VerticalAlignment="Center"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,8">
<TextBlock Text="除霜计时" Width="130" FontSize="14" VerticalAlignment="Center"/>
<TextBlock Text="{Binding RealTime.DefrostMinute, StringFormat='{}{0}分'}" FontSize="18" FontWeight="Bold" Foreground="#00796B" Margin="0,0,10,0"/>
<TextBlock Text="{Binding RealTime.DefrostSecond, StringFormat='{}{0}秒'}" FontSize="18" FontWeight="Bold" Foreground="#00796B"/>
</StackPanel>
</StackPanel>
</Border>
</Grid>
</GroupBox>
<!-- 主内容 (Row 3) -->
<Grid Grid.Row="3" Margin="0,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="280"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- 左侧控制区 -->
<Border Grid.Column="0" Background="White" CornerRadius="8" Padding="10" Margin="0,0,10,0" BorderBrush="#DDDDDD" BorderThickness="1">
<StackPanel>
<GroupBox Header="通讯控制" Margin="0,0,0,10">
<StackPanel>
<Button Command="{Binding ConnectCommand}" Content="连接PLC" Height="45"/>
<Button Command="{Binding DisconnectCommand}" Content="断开连接" Height="45"/>
</StackPanel>
</GroupBox>
<GroupBox Header="采样参数" Margin="0,0,0,10">
<StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,5">
<TextBlock Text="采样时间(秒):" Width="100" VerticalAlignment="Center" FontSize="14"/>
<TextBox Text="{Binding SampleTimeSeconds}" Width="80" IsEnabled="{Binding IsTesting, Converter={StaticResource InverseBoolConverter}}"/>
</StackPanel>
<Button Command="{Binding StartTestCommand}" Content="开始测试" Height="45" Margin="0,10,0,0" IsEnabled="{Binding IsTesting, Converter={StaticResource InverseBoolConverter}}"/>
<TextBlock Text="测试进行中..." Visibility="{Binding IsTesting, Converter={StaticResource BoolToVisibilityConverter}}" Foreground="Orange" FontWeight="Bold" FontSize="14" Margin="0,5,0,0" HorizontalAlignment="Center"/>
</StackPanel>
</GroupBox>
<GroupBox Header="数据分析">
<StackPanel>
<Button Command="{Binding CalculateCommand}" Content="计算结果" Height="45"/>
<Button Command="{Binding ExportReportCommand}" Content="导出报告" Height="45"/>
</StackPanel>
</GroupBox>
</StackPanel>
</Border>
<!-- 右侧称重数据表格 -->
<Border Grid.Column="1" Background="White" CornerRadius="8" Padding="10" BorderBrush="#DDDDDD" BorderThickness="1">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<DataGrid ItemsSource="{Binding Stages}" AutoGenerateColumns="False" CanUserAddRows="False" IsReadOnly="False">
<DataGrid.Columns>
<DataGridTextColumn Header="层级" Binding="{Binding StageName}" Width="80" IsReadOnly="True"/>
<DataGridTextColumn Header="截止直径(μm)" Binding="{Binding CutoffDiameter, StringFormat='{}{0:F1}'}" Width="100" IsReadOnly="True"/>
<DataGridTextColumn Header="测前质量(g)" Binding="{Binding InitialWeight, StringFormat='{}{0:F4}'}" Width="120">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextAlignment" Value="Center"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="测后质量(g)" Binding="{Binding FinalWeight, StringFormat='{}{0:F4}'}" Width="120">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextAlignment" Value="Center"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="净重(g)" Binding="{Binding NetWeight, StringFormat='{}{0:F6}'}" Width="120" IsReadOnly="True">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextAlignment" Value="Center"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</ScrollViewer>
</Border>
</Grid>
<!-- 结果显示 (Row 4) -->
<Border Grid.Row="4" Background="#E8F5E9" CornerRadius="8" Padding="12" Margin="0,10,0,0" BorderBrush="#A5D6A7" BorderThickness="1">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<TextBlock Text="微细粒子剂量(FPD): " FontWeight="Bold" FontSize="16"/>
<TextBlock Text="{Binding CurrentResult.FineParticleDose, StringFormat='{}{0:F2} mg'}" FontSize="16" FontWeight="Bold" Foreground="#1565C0" Margin="5,0,30,0"/>
<TextBlock Text="微细粒子分数(FPF): " FontWeight="Bold" FontSize="16"/>
<TextBlock Text="{Binding CurrentResult.FineParticleFraction, StringFormat='{}{0:F2} %'}" FontSize="16" FontWeight="Bold" Foreground="#1565C0"/>
</StackPanel>
</Border>
</Grid>
</Window>