Files
CSI-Z420-Tablet-Multi-Funct…/Views/MainWindow.xaml
2026-05-14 09:51:54 +08:00

352 lines
25 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<Window x:Class="TabletTester2025.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:oxy="http://oxyplot.org/wpf"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:helpers="clr-namespace:TabletTester2025.Helpers"
Title="片剂四用仪 (中国药典2025)" Width="1024" MinHeight="768" WindowState="Maximized"
WindowStartupLocation="CenterScreen"
Background="#F0F2F5">
<Window.Resources>
<helpers:BasketOffsetConverter x:Key="BasketOffsetConverter"/>
<helpers:PassToTextConverter x:Key="PassToTextConverter"/>
<helpers:BoolToColorConverter x:Key="BoolToColorConverter"/>
<helpers:StatusColorConverter x:Key="StatusColorConverter"/>
<DropShadowEffect x:Key="DropShadowLight" BlurRadius="5" ShadowDepth="2" Opacity="0.2"/>
<!-- 统一按钮样式 -->
<Style TargetType="Button" x:Key="ActionButton">
<Setter Property="MinWidth" Value="80"/>
<Setter Property="Height" Value="30"/>
<Setter Property="Margin" Value="6,0"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Background" Value="#2196F3"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Background="{TemplateBinding Background}" CornerRadius="4" Padding="8,0">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- 工位卡片模板 -->
<DataTemplate x:Key="StationCardTemplate">
<Border BorderBrush="#CCC" BorderThickness="1" CornerRadius="12" Margin="10" Padding="12"
Background="White" Effect="{StaticResource DropShadowLight}">
<StackPanel>
<!-- 工位标题 -->
<TextBlock Text="{Binding StationId, StringFormat='工位 {0}'}" FontSize="20" FontWeight="Bold"
Margin="0,0,0,12" Foreground="#1976D2" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding LocalAlarm}" FontWeight="Bold" Margin="0,5,0,5" HorizontalAlignment="Center">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Red"/>
<Style.Triggers>
<!-- 当文本包含“合格”时变为绿色 -->
<DataTrigger Binding="{Binding LocalAlarm}" Value="硬度测试合格">
<Setter Property="Foreground" Value="Green"/>
</DataTrigger>
<DataTrigger Binding="{Binding LocalAlarm}" Value="脆碎度测试合格">
<Setter Property="Foreground" Value="Green"/>
</DataTrigger>
<DataTrigger Binding="{Binding LocalAlarm}" Value="崩解测试合格">
<Setter Property="Foreground" Value="Green"/>
</DataTrigger>
<DataTrigger Binding="{Binding LocalAlarm}" Value="溶出测试合格">
<Setter Property="Foreground" Value="Green"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<TabControl FontSize="13" BorderThickness="0">
<!-- ========== 硬度测试 ========== -->
<TabItem Header="硬度测试">
<Grid Margin="5">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- 参数设置区 -->
<GroupBox Header="测试参数设置" Grid.Row="0" Margin="0,5">
<UniformGrid Columns="1" Rows="2" Margin="10">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="0,10,0,0" >
<TextBlock Text="试验次数设定:" Width="100" VerticalAlignment="Center"/>
<TextBox Text="{Binding HardnessTestCount, UpdateSourceTrigger=PropertyChanged}" Width="80"/>
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="0,10,0,0">
<TextBlock Text="试验次数间隔(秒)" Width="100" VerticalAlignment="Center"/>
<TextBox Text="{Binding HardnessIntervalSec, UpdateSourceTrigger=PropertyChanged}" Width="80"/>
</StackPanel>
</UniformGrid>
</GroupBox>
<!-- 测试结果区 -->
<GroupBox Header="测试结果" Grid.Row="1" Margin="0,5">
<UniformGrid Columns="3" Rows="1" Margin="10">
<StackPanel HorizontalAlignment="Center">
<TextBlock Text="最大值(N)" FontWeight="SemiBold" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding HardnessMax, StringFormat=F1}" FontSize="22" Foreground="Blue" HorizontalAlignment="Center"/>
</StackPanel>
<StackPanel HorizontalAlignment="Center">
<TextBlock Text="最小值(N)" FontWeight="SemiBold" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding HardnessMin, StringFormat=F1}" FontSize="22" Foreground="Blue" HorizontalAlignment="Center"/>
</StackPanel>
<StackPanel HorizontalAlignment="Center">
<TextBlock Text="平均值(N)" FontWeight="SemiBold" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding HardnessAvg, StringFormat=F1}" FontSize="22" Foreground="Green" HorizontalAlignment="Center"/>
</StackPanel>
</UniformGrid>
</GroupBox>
<!-- 参数状态显示区 -->
<GroupBox Header="参数状态显示" Grid.Row="2" Margin="0,5">
<UniformGrid Columns="2" Rows="1" Margin="10">
<StackPanel>
<TextBlock Text="试验次数" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding HardnessCurrentCount, StringFormat=F0}" FontSize="18" HorizontalAlignment="Center"/>
</StackPanel>
<StackPanel>
<TextBlock Text="测试力值(N)" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding HardnessValue, StringFormat=F1}" FontSize="18" Foreground="#FF9800" HorizontalAlignment="Center"/>
</StackPanel>
</UniformGrid>
</GroupBox>
<!-- 按钮区 -->
<WrapPanel Grid.Row="3" HorizontalAlignment="Center" Margin="0,10">
<Button Command="{Binding HardnessUpCommand}" Content="梁杆上升" Style="{StaticResource ActionButton}" Background="#FF9800" Margin="5 10 5 10"/>
<Button Command="{Binding HardnessDownCommand}" Content="梁杆下降" Style="{StaticResource ActionButton}" Background="#FF9800"/>
<Button Command="{Binding HardnessResetCommand}" Content="复位" Style="{StaticResource ActionButton}" Background="#9E9E9E"/>
<Button Command="{Binding PrintHardnessCommand}" Content="打印" Style="{StaticResource ActionButton}" Background="#607D8B"/>
<Button Command="{Binding StartHardnessCommand}" Content="启动测试" Style="{StaticResource ActionButton}" Background="#4CAF50" Margin="5 0 0 0"/>
</WrapPanel>
</Grid>
</TabItem>
<!-- ========== 脆碎度测试 ========== -->
<TabItem Header="脆碎度测试">
<Grid Margin="5">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<GroupBox Header="测试参数设置" Grid.Row="0" Margin="0,5">
<UniformGrid Columns="2" Rows="2" Margin="10">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
<TextBlock Text="转速设置(r/min)" Width="110" VerticalAlignment="Center"/>
<TextBox Text="{Binding FriabilityTargetRpm, UpdateSourceTrigger=PropertyChanged}" Width="60"/>
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
<TextBlock Text="转数设置(秒)" Width="110" VerticalAlignment="Center"/>
<TextBox Text="{Binding FriabilityTargetTimeSec, UpdateSourceTrigger=PropertyChanged}" Width="60"/>
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
<TextBlock Text="方向:" Width="50" VerticalAlignment="Center" Margin="0 10 0 0"/>
<RadioButton Content="顺时针" IsChecked="{Binding FriabilityClockwise}" Margin="0,10,10,0"/>
<RadioButton Content="逆时针" IsChecked="{Binding FriabilityCounterClockwise}" Margin="0 10 0 0"/>
</StackPanel>
</UniformGrid>
</GroupBox>
<GroupBox Header="参数状态显示" Grid.Row="1" Margin="0,5">
<UniformGrid Columns="2" Rows="1" Margin="10">
<StackPanel>
<TextBlock Text="转速显示(r/min)" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding FriabilityCurrentRpm, StringFormat=F1}" FontSize="18" HorizontalAlignment="Center"/>
</StackPanel>
<StackPanel>
<TextBlock Text="剩余圈数" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding FriabilityRemainingRounds}" FontSize="18" HorizontalAlignment="Center"/>
</StackPanel>
</UniformGrid>
</GroupBox>
<WrapPanel Grid.Row="2" HorizontalAlignment="Center" Margin="0,10">
<Button Command="{Binding StartFriabilityCommand}" Content="测试启动" Style="{StaticResource ActionButton}" Background="#4CAF50"/>
<Button Command="{Binding StopFriabilityCommand}" Content="测试停止" Style="{StaticResource ActionButton}" Background="#F44336"/>
<Button Command="{Binding ResetFriabilityCommand}" Content="复位" Style="{StaticResource ActionButton}" Background="#9E9E9E"/>
<!--<Button Command="{Binding PrintFriabilityCommand}" Content="脆碎度测试记录" Style="{StaticResource ActionButton}" Background="#607D8B"/>-->
</WrapPanel>
</Grid>
</TabItem>
<!-- ========== 溶出度 ========== -->
<TabItem Header="溶出度">
<Grid Margin="5">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<GroupBox Header="测试参数设置" Grid.Row="0" Margin="0,5">
<UniformGrid Columns="2" Rows="2" Margin="10">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
<TextBlock Text="升降频率(次/min)" Width="130" VerticalAlignment="Center"/>
<TextBox Text="{Binding DissolutionUpDownFreq, UpdateSourceTrigger=PropertyChanged}" Width="60"/>
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
<TextBlock Text="取样周期设置(min)" Width="130" VerticalAlignment="Center"/>
<TextBox Text="{Binding DissolutionSampleInterval, UpdateSourceTrigger=PropertyChanged}" Width="60"/>
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
<TextBlock Text="转速设置(r/min)" Width="130" VerticalAlignment="Center"/>
<TextBox Text="{Binding DissolutionTargetRpm, UpdateSourceTrigger=PropertyChanged}" Width="60"/>
</StackPanel>
</UniformGrid>
</GroupBox>
<GroupBox Header="测试状态显示" Grid.Row="1" Margin="0,5">
<UniformGrid Columns="3" Rows="1" Margin="10">
<StackPanel>
<TextBlock Text="水浴温度显示(℃)" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding DisintegrationTemp, StringFormat=F1}" FontSize="18" Foreground="#E91E63" HorizontalAlignment="Center"/>
</StackPanel>
<StackPanel>
<TextBlock Text="试验运行时间(min)" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding DissolutionElapsedTime, StringFormat=F1}" FontSize="18" HorizontalAlignment="Center"/>
</StackPanel>
<StackPanel>
<TextBlock Text="取样倒计时(min)" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding DissolutionCountdown, StringFormat=F1}" FontSize="18" HorizontalAlignment="Center"/>
</StackPanel>
</UniformGrid>
</GroupBox>
<GroupBox Header="溶出曲线 &amp; R²值" Grid.Row="2" Margin="0,5">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="140"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<oxy:PlotView Model="{Binding DissolutionPlotModel}" Height="130" Margin="5"/>
<TextBlock Grid.Row="1" Text="{Binding DissolutionRSquared, StringFormat='R² = {0:F4}'}"
FontWeight="Bold" Margin="5,0,0,5"/>
</Grid>
</GroupBox>
<WrapPanel Grid.Row="3" HorizontalAlignment="Center" Margin="0,10">
<Button Command="{Binding DissolutionUpCommand}" Content="浆杆上升" Style="{StaticResource ActionButton}" Background="#FF9800"/>
<Button Command="{Binding DissolutionDownCommand}" Content="浆杆下降" Style="{StaticResource ActionButton}" Background="#FF9800"/>
<Button Command="{Binding StartDissolutionCommand}" Content="测试启动" Style="{StaticResource ActionButton}" Background="#4CAF50"/>
<Button Command="{Binding StopDissolutionCommand}" Content="测试停止" Style="{StaticResource ActionButton}" Background="#F44336"/>
<!--<Button Command="{Binding PrintDissolutionCommand}" Content="溶出度测试记录" Style="{StaticResource ActionButton}" Background="#607D8B" Margin="5 10 0 0"/>-->
</WrapPanel>
</Grid>
</TabItem>
<!-- ========== 崩解时限 ========== -->
<TabItem Header="崩解时限">
<Grid Margin="5">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<GroupBox Header="测试参数设置" Grid.Row="0" Margin="0,5">
<UniformGrid Columns="1" Rows="1" Margin="10">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
<TextBlock Text="升降频率(次/min)" Width="130" VerticalAlignment="Center"/>
<TextBox Text="{Binding DisintegrationTargetFreq, UpdateSourceTrigger=PropertyChanged}" Width="60"/>
</StackPanel>
</UniformGrid>
</GroupBox>
<GroupBox Header="测试状态显示" Grid.Row="1" Margin="0,5">
<UniformGrid Columns="3" Rows="1" Margin="10">
<StackPanel>
<TextBlock Text="水浴温度显示(℃)" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding DisintegrationTemp, StringFormat=F1}" FontSize="18" Foreground="#E91E63" HorizontalAlignment="Center"/>
</StackPanel>
<StackPanel>
<TextBlock Text="试验运行时间(秒)" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding DisintegrationSeconds}" FontSize="18" HorizontalAlignment="Center"/>
</StackPanel>
<StackPanel>
<TextBlock Text="剩余未崩解管数" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding RemainingTubes}" FontSize="18" Foreground="Red" HorizontalAlignment="Center"/>
</StackPanel>
</UniformGrid>
</GroupBox>
<WrapPanel Grid.Row="2" HorizontalAlignment="Center" Margin="0,10">
<Button Command="{Binding StartDisintegrationCommand}" Content="测试启动" Style="{StaticResource ActionButton}" Background="#4CAF50"/>
<Button Command="{Binding StopDisintegrationCommand}" Content="测试停止" Style="{StaticResource ActionButton}" Background="#F44336"/>
<!--<Button Command="{Binding PrintDisintegrationCommand}" Content="崩解时限记录" Style="{StaticResource ActionButton}" Background="#607D8B"/>-->
</WrapPanel>
</Grid>
</TabItem>
</TabControl>
</StackPanel>
</Border>
</DataTemplate>
</Window.Resources>
<!-- 主布局 -->
<Grid Margin="10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- 标题栏 -->
<Border Background="#1976D2" CornerRadius="8" Margin="0,0,0,16" Padding="12">
<Grid>
<TextBlock Text="片剂四用仪 (硬度·脆碎度·崩解·溶出) 符合《中国药典》2025年版"
FontSize="22" FontWeight="Bold" Foreground="White" VerticalAlignment="Center"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Center">
<Button Command="{Binding OpenSettingsCommand}" Content="⚙ 参数设置" Style="{StaticResource ActionButton}"/>
<Button Command="{Binding OpenHistoryCommand}" Content="📜 历史记录" Style="{StaticResource ActionButton}"/>
<Button Command="{Binding OpenCalibrationCommand}" Content="🔧 校准" Style="{StaticResource ActionButton}"/>
<Button Command="{Binding ExportAllCommand}" Content="📁 导出全部" Style="{StaticResource ActionButton}"/>
</StackPanel>
</Grid>
</Border>
<!-- 三工位容器 -->
<UniformGrid Grid.Row="1" Columns="3" Rows="1" Margin="0,0,0,16">
<ContentControl Content="{Binding Stations[0]}" ContentTemplate="{StaticResource StationCardTemplate}"/>
<ContentControl Content="{Binding Stations[1]}" ContentTemplate="{StaticResource StationCardTemplate}"/>
<ContentControl Content="{Binding Stations[2]}" ContentTemplate="{StaticResource StationCardTemplate}"/>
</UniformGrid>
<!-- 状态栏 -->
<StatusBar Grid.Row="2" Background="#FFF" BorderBrush="#DDD" BorderThickness="0,1,0,0" Padding="8">
<StatusBarItem>
<StackPanel Orientation="Horizontal">
<Ellipse Width="10" Height="10" Fill="{Binding PlcStatus, Converter={StaticResource StatusColorConverter}}" Margin="0,0,5,0"/>
<TextBlock Text="PLC: "/>
<TextBlock Text="{Binding PlcStatus}"/>
</StackPanel>
</StatusBarItem>
<Separator/>
<StatusBarItem>
<StackPanel Orientation="Horizontal">
<TextBlock Text="当前时间: "/>
<TextBlock Text="{Binding CurrentTime}"/>
</StackPanel>
</StatusBarItem>
<Separator/>
<StatusBarItem>
<StackPanel Orientation="Horizontal">
<TextBlock Text="⚠ " Foreground="#FF5722"/>
<TextBlock Text="{Binding GlobalAlarm}" Foreground="Red"/>
</StackPanel>
</StatusBarItem>
</StatusBar>
</Grid>
</Window>