Files
CSI-Z420-Tablet-Multi-Funct…/Views/MainWindow.xaml
GukSang.Jin 9de217d2ff 更新2026
2026-05-16 16:58:57 +08:00

440 lines
30 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="92"/>
<Setter Property="Height" Value="36"/>
<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="FontWeight" Value="SemiBold"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Background="{TemplateBinding Background}" CornerRadius="4" Padding="8,0">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Opacity" Value="0.45"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="TabControl">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Margin" Value="0"/>
</Style>
<Style TargetType="TabItem">
<Setter Property="FontSize" Value="15"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Padding" Value="22,10"/>
<Setter Property="Foreground" Value="#475569"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TabItem">
<Border x:Name="TabBorder" Background="#F8FAFC" BorderBrush="#D6DEE8" BorderThickness="1,1,1,0"
CornerRadius="6,6,0,0" Padding="{TemplateBinding Padding}" Margin="0,0,4,0">
<ContentPresenter ContentSource="Header" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="TabBorder" Property="Background" Value="White"/>
<Setter TargetName="TabBorder" Property="BorderBrush" Value="#1976D2"/>
<Setter Property="Foreground" Value="#0F3D68"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="GroupBox">
<Setter Property="BorderBrush" Value="#D7DEE8"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Padding" Value="10"/>
<Setter Property="Margin" Value="0,8"/>
<Setter Property="FontWeight" Value="SemiBold"/>
</Style>
<Style TargetType="TextBox">
<Setter Property="Height" Value="30"/>
<Setter Property="Padding" Value="6,2"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="BorderBrush" Value="#B8C4D4"/>
<Setter Property="BorderThickness" Value="1"/>
</Style>
<!-- 四功能测试工作区模板 -->
<DataTemplate x:Key="StationCardTemplate">
<Border BorderBrush="#D7DEE8" BorderThickness="1" CornerRadius="8" Margin="0" Padding="8,6,8,8"
Background="White" Effect="{StaticResource DropShadowLight}">
<StackPanel>
<TextBlock Text="{Binding LocalAlarm}" FontWeight="Bold" Margin="0,0,0,6" HorizontalAlignment="Center">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Red"/>
<Setter Property="Visibility" Value="Visible"/>
<Style.Triggers>
<DataTrigger Binding="{Binding LocalAlarm}" Value="{x:Null}">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
<DataTrigger Binding="{Binding LocalAlarm}" Value="">
<Setter Property="Visibility" Value="Collapsed"/>
</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>
<DataTrigger Binding="{Binding LocalAlarm}" Value="溶出测试合格">
<Setter Property="Foreground" Value="Green"/>
</DataTrigger>
<DataTrigger Binding="{Binding LocalAlarm}" Value="溶出1测试合格">
<Setter Property="Foreground" Value="Green"/>
</DataTrigger>
<DataTrigger Binding="{Binding LocalAlarm}" Value="溶出2测试合格">
<Setter Property="Foreground" Value="Green"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<TabControl FontSize="13" BorderThickness="0">
<!-- ========== 硬度测试 ========== -->
<TabItem Header="硬度测试">
<Grid Margin="4,6,4,4">
<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"/>
<Button Command="{Binding StopHardnessCommand}" Content="测试停止" Style="{StaticResource ActionButton}" Background="#F44336"/>
</WrapPanel>
</Grid>
</TabItem>
<!-- ========== 脆碎度测试 ========== -->
<TabItem Header="脆碎度测试">
<Grid Margin="4,6,4,4">
<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="3" Margin="10" >
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="0,15,0,0" >
<TextBlock Text="转速设置(r/min)" Width="110" VerticalAlignment="Center"/>
<TextBox Text="{Binding FriabilityTargetRpm, UpdateSourceTrigger=PropertyChanged}" Width="100"/>
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="0,15,0,0" >
<TextBlock Text="转数设置(秒)" Width="110" VerticalAlignment="Center"/>
<TextBox Text="{Binding FriabilityTargetTimeSec, UpdateSourceTrigger=PropertyChanged}" Width="100"/>
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="0,10,0,0" Width="280" >
<TextBlock Text="方向:" Width="80" 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,45,0,15">
<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" Margin="5 10 5 10"/>
<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="溶出度">
<ScrollViewer VerticalScrollBarVisibility="Auto"
Height="470">
<Grid Margin="4,6,4,4">
<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,6,10,0">
<TextBlock Text="溶出1时间(min)" Width="130" VerticalAlignment="Center"/>
<TextBox Text="{Binding Dissolution1TimeMin, UpdateSourceTrigger=PropertyChanged}" Width="80"/>
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="0,6,10,0">
<TextBlock Text="溶出2时间(min)" Width="130" VerticalAlignment="Center"/>
<TextBox Text="{Binding Dissolution2TimeMin, UpdateSourceTrigger=PropertyChanged}" Width="80"/>
</StackPanel>
</UniformGrid>
</GroupBox>
<GroupBox Header="测试状态显示" Grid.Row="1" Margin="0,5">
<UniformGrid Columns="2" Rows="3" Margin="10">
<StackPanel Margin="0,5">
<TextBlock Text="水浴温度显示(℃)" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding DisintegrationTemp, StringFormat=F1}" FontSize="18" Foreground="#E91E63" HorizontalAlignment="Center"/>
</StackPanel>
<StackPanel Margin="0,5">
<TextBlock Text="试验运行时间(min)" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding DissolutionElapsedTime, StringFormat=F1}" FontSize="18" HorizontalAlignment="Center"/>
</StackPanel>
<StackPanel Margin="0,5">
<TextBlock Text="取样倒计时(min)" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding DissolutionCountdown, StringFormat=F1}" FontSize="18" HorizontalAlignment="Center"/>
</StackPanel>
<StackPanel Margin="0,5">
<TextBlock Text="溶出1溶出度(%)" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding Dissolution1Percent, StringFormat=F1}" FontSize="18" Foreground="#2E7D32" HorizontalAlignment="Center"/>
</StackPanel>
<StackPanel Margin="0,5">
<TextBlock Text="溶出2溶出度(%)" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding Dissolution2Percent, StringFormat=F1}" FontSize="18" Foreground="#1565C0" HorizontalAlignment="Center"/>
</StackPanel>
</UniformGrid>
</GroupBox>
<GroupBox Header="溶出双曲线 &amp; R²值" Grid.Row="2" Margin="0,5">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="200"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<oxy:PlotView Model="{Binding DissolutionPlotModel}" Height="180" Margin="5"/>
<StackPanel Grid.Row="1" Orientation="Horizontal" Margin="5,0,0,5">
<TextBlock Text="{Binding Dissolution1RSquared, StringFormat='溶出1 R² = {0:F4}'}"
FontWeight="Bold" Margin="0,0,20,0"/>
<TextBlock Text="{Binding Dissolution2RSquared, StringFormat='溶出2 R² = {0:F4}'}"
FontWeight="Bold"/>
</StackPanel>
<TextBlock Grid.Row="2" Text="{Binding DissolutionCurveStatus}" Foreground="#D32F2F" FontWeight="SemiBold" Margin="5,0,0,5"/>
</Grid>
</GroupBox>
<WrapPanel Grid.Row="3" HorizontalAlignment="Center" Margin="0,10">
<Button Command="{Binding StartDissolution1Command}" Content="溶出1开始" Style="{StaticResource ActionButton}" Background="#4CAF50" Margin="5 10 5 10"/>
<Button Command="{Binding StopDissolution1Command}" Content="溶出1停止" Style="{StaticResource ActionButton}" Background="#F44336"/>
<Button Command="{Binding StartDissolution2Command}" Content="溶出2开始" Style="{StaticResource ActionButton}" Background="#4CAF50"/>
<Button Command="{Binding StopDissolution2Command}" Content="溶出2停止" Style="{StaticResource ActionButton}" Background="#F44336"/>
<!--<Button Command="{Binding PrintDissolutionCommand}" Content="溶出度测试记录" Style="{StaticResource ActionButton}" Background="#607D8B" Margin="5 10 0 0"/>-->
</WrapPanel>
</Grid>
</ScrollViewer>
</TabItem>
<!-- ========== 崩解时限 ========== -->
<TabItem Header="崩解时限">
<Grid Margin="4,6,4,4">
<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="2" Margin="10">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
<TextBlock Text="崩速度(r/min)" Width="130" VerticalAlignment="Center"/>
<TextBox Text="{Binding DisintegrationSpeedRpm, UpdateSourceTrigger=PropertyChanged}" Width="80"/>
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
<TextBlock Text="崩解时间(min)" Width="130" VerticalAlignment="Center"/>
<TextBox Text="{Binding DisintegrationTimeMin, UpdateSourceTrigger=PropertyChanged}" Width="80"/>
</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="#0F3D68" CornerRadius="6" Margin="0,0,0,8" Padding="12,10">
<Grid>
<TextBlock Text="CSI-Z420 片剂四用仪 硬度 · 脆碎度 · 溶出 · 崩解"
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>
<!-- 四功能测试工作区 -->
<ContentControl Grid.Row="1" Margin="0,0,0,16"
Content="{Binding Tester}"
ContentTemplate="{StaticResource StationCardTemplate}"/>
<!-- 状态栏 -->
<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>
<!-- 透明的点击区域:完全看不到,但是能响应点击 -->
<Button Background="Transparent" Margin="10" Width="80" Height="30"
Command="{Binding ShowDataCommand}">
</Button>
</StatusBar>
</Grid>
</Window>