365 lines
26 KiB
XML
365 lines
26 KiB
XML
<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"/>
|
||
<Button Command="{Binding StopFriabilityCommand}" Content="测试停止" Style="{StaticResource ActionButton}" Background="#F44336"/>
|
||
</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="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="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="3" Margin="10">
|
||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="0,10,10,0">
|
||
<TextBlock Text="升降频率(次/min):" Width="130" VerticalAlignment="Center"/>
|
||
<TextBox Text="{Binding DissolutionUpDownFreq, UpdateSourceTrigger=PropertyChanged}" Width="80"/>
|
||
</StackPanel>
|
||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="0,10,10,0">
|
||
<TextBlock Text="取样周期设置(min):" Width="130" VerticalAlignment="Center"/>
|
||
<TextBox Text="{Binding DissolutionSampleInterval, UpdateSourceTrigger=PropertyChanged}" Width="80"/>
|
||
</StackPanel>
|
||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="0,10,10,0">
|
||
<TextBlock Text="转速设置(r/min):" Width="130" VerticalAlignment="Center"/>
|
||
<TextBox Text="{Binding DissolutionTargetRpm, UpdateSourceTrigger=PropertyChanged}" Width="80"/>
|
||
</StackPanel>
|
||
</UniformGrid>
|
||
</GroupBox>
|
||
|
||
<GroupBox Header="测试状态显示" Grid.Row="1" Margin="0,5">
|
||
<UniformGrid Columns="2" Rows="2" 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>
|
||
</UniformGrid>
|
||
</GroupBox>
|
||
|
||
<GroupBox Header="溶出曲线 & R²值" Grid.Row="2" Margin="0,5">
|
||
<Grid>
|
||
<Grid.RowDefinitions>
|
||
<RowDefinition Height="200"/>
|
||
<RowDefinition Height="Auto"/>
|
||
</Grid.RowDefinitions>
|
||
<oxy:PlotView Model="{Binding DissolutionPlotModel}" Height="180" 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" Margin="5 10 5 10"/>
|
||
<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>
|
||
</ScrollViewer>
|
||
</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="片剂四用仪 (硬度·脆碎度·崩解·溶出) 符合《中国药典》"
|
||
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>
|
||
<!-- 透明的点击区域:完全看不到,但是能响应点击 -->
|
||
<Button Background="Transparent" Margin="10" Width="80" Height="30"
|
||
Command="{Binding ShowDataCommand}">
|
||
|
||
</Button>
|
||
</StatusBar>
|
||
|
||
</Grid>
|
||
|
||
</Window> |