This commit is contained in:
GukSang.Jin
2026-05-16 17:33:25 +08:00
parent 9de217d2ff
commit 6ed2c7a45e

View File

@@ -1,35 +1,53 @@
<Window x:Class="TabletTester2025.MainWindow" <Window x:Class="TabletTester2025.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:oxy="http://oxyplot.org/wpf" xmlns:oxy="http://oxyplot.org/wpf"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:helpers="clr-namespace:TabletTester2025.Helpers" xmlns:helpers="clr-namespace:TabletTester2025.Helpers"
Title="片剂四用仪 (中国药典2025)" Width="1024" MinHeight="768" WindowState="Maximized" Title="片剂四用仪 (中国药典2025)"
WindowStartupLocation="CenterScreen" Width="1024"
Background="#F0F2F5"> MinHeight="768"
WindowState="Maximized"
WindowStartupLocation="CenterScreen"
Background="#EDF1F5">
<Window.Resources> <Window.Resources>
<helpers:BasketOffsetConverter x:Key="BasketOffsetConverter"/> <helpers:BasketOffsetConverter x:Key="BasketOffsetConverter"/>
<helpers:PassToTextConverter x:Key="PassToTextConverter"/> <helpers:PassToTextConverter x:Key="PassToTextConverter"/>
<helpers:BoolToColorConverter x:Key="BoolToColorConverter"/> <helpers:BoolToColorConverter x:Key="BoolToColorConverter"/>
<helpers:StatusColorConverter x:Key="StatusColorConverter"/> <helpers:StatusColorConverter x:Key="StatusColorConverter"/>
<DropShadowEffect x:Key="DropShadowLight" BlurRadius="5" ShadowDepth="2" Opacity="0.2"/>
<!-- 统一按钮样式 --> <DropShadowEffect x:Key="DropShadowLight" BlurRadius="6" ShadowDepth="1" Opacity="0.14"/>
<SolidColorBrush x:Key="PrimaryBrush" Color="#1565A9"/>
<SolidColorBrush x:Key="PanelBorderBrush" Color="#D8E1EC"/>
<SolidColorBrush x:Key="PanelBackgroundBrush" Color="#FFFFFF"/>
<SolidColorBrush x:Key="SubtleBackgroundBrush" Color="#F7FAFC"/>
<SolidColorBrush x:Key="LabelBrush" Color="#526273"/>
<SolidColorBrush x:Key="ValueBrush" Color="#102A43"/>
<Style TargetType="Button" x:Key="ActionButton"> <Style TargetType="Button" x:Key="ActionButton">
<Setter Property="MinWidth" Value="92"/> <Setter Property="MinWidth" Value="112"/>
<Setter Property="Height" Value="36"/> <Setter Property="Height" Value="42"/>
<Setter Property="Margin" Value="6,0"/> <Setter Property="Margin" Value="6"/>
<Setter Property="Padding" Value="14,0"/>
<Setter Property="Cursor" Value="Hand"/> <Setter Property="Cursor" Value="Hand"/>
<Setter Property="Background" Value="#2196F3"/> <Setter Property="Background" Value="{StaticResource PrimaryBrush}"/>
<Setter Property="Foreground" Value="White"/> <Setter Property="Foreground" Value="White"/>
<Setter Property="BorderThickness" Value="0"/> <Setter Property="BorderThickness" Value="0"/>
<Setter Property="FontSize" Value="15"/>
<Setter Property="FontWeight" Value="SemiBold"/> <Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Template"> <Setter Property="Template">
<Setter.Value> <Setter.Value>
<ControlTemplate TargetType="Button"> <ControlTemplate TargetType="Button">
<Border Background="{TemplateBinding Background}" CornerRadius="4" Padding="8,0"> <Border Background="{TemplateBinding Background}" CornerRadius="4" Padding="{TemplateBinding Padding}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border> </Border>
<ControlTemplate.Triggers> <ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Opacity" Value="0.9"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Opacity" Value="0.78"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False"> <Trigger Property="IsEnabled" Value="False">
<Setter Property="Opacity" Value="0.45"/> <Setter Property="Opacity" Value="0.45"/>
</Trigger> </Trigger>
@@ -39,6 +57,22 @@
</Setter> </Setter>
</Style> </Style>
<Style TargetType="Button" x:Key="StartButton" BasedOn="{StaticResource ActionButton}">
<Setter Property="Background" Value="#2E7D32"/>
</Style>
<Style TargetType="Button" x:Key="StopButton" BasedOn="{StaticResource ActionButton}">
<Setter Property="Background" Value="#C62828"/>
</Style>
<Style TargetType="Button" x:Key="ResetButton" BasedOn="{StaticResource ActionButton}">
<Setter Property="Background" Value="#687789"/>
</Style>
<Style TargetType="Button" x:Key="SecondaryButton" BasedOn="{StaticResource ActionButton}">
<Setter Property="Background" Value="#496579"/>
</Style>
<Style TargetType="TabControl"> <Style TargetType="TabControl">
<Setter Property="Background" Value="Transparent"/> <Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/> <Setter Property="BorderThickness" Value="0"/>
@@ -46,21 +80,26 @@
</Style> </Style>
<Style TargetType="TabItem"> <Style TargetType="TabItem">
<Setter Property="FontSize" Value="15"/> <Setter Property="FontSize" Value="16"/>
<Setter Property="FontWeight" Value="SemiBold"/> <Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Padding" Value="22,10"/> <Setter Property="Padding" Value="24,12"/>
<Setter Property="Foreground" Value="#475569"/> <Setter Property="Foreground" Value="#465A6E"/>
<Setter Property="Template"> <Setter Property="Template">
<Setter.Value> <Setter.Value>
<ControlTemplate TargetType="TabItem"> <ControlTemplate TargetType="TabItem">
<Border x:Name="TabBorder" Background="#F8FAFC" BorderBrush="#D6DEE8" BorderThickness="1,1,1,0" <Border x:Name="TabBorder"
CornerRadius="6,6,0,0" Padding="{TemplateBinding Padding}" Margin="0,0,4,0"> Background="#F6F9FC"
BorderBrush="#D3DEEA"
BorderThickness="1,1,1,0"
CornerRadius="6,6,0,0"
Padding="{TemplateBinding Padding}"
Margin="0,0,6,0">
<ContentPresenter ContentSource="Header" HorizontalAlignment="Center" VerticalAlignment="Center"/> <ContentPresenter ContentSource="Header" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border> </Border>
<ControlTemplate.Triggers> <ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True"> <Trigger Property="IsSelected" Value="True">
<Setter TargetName="TabBorder" Property="Background" Value="White"/> <Setter TargetName="TabBorder" Property="Background" Value="White"/>
<Setter TargetName="TabBorder" Property="BorderBrush" Value="#1976D2"/> <Setter TargetName="TabBorder" Property="BorderBrush" Value="{StaticResource PrimaryBrush}"/>
<Setter Property="Foreground" Value="#0F3D68"/> <Setter Property="Foreground" Value="#0F3D68"/>
</Trigger> </Trigger>
</ControlTemplate.Triggers> </ControlTemplate.Triggers>
@@ -70,30 +109,100 @@
</Style> </Style>
<Style TargetType="GroupBox"> <Style TargetType="GroupBox">
<Setter Property="BorderBrush" Value="#D7DEE8"/> <Setter Property="BorderBrush" Value="{StaticResource PanelBorderBrush}"/>
<Setter Property="BorderThickness" Value="1"/> <Setter Property="BorderThickness" Value="1"/>
<Setter Property="Padding" Value="10"/> <Setter Property="Padding" Value="14"/>
<Setter Property="Margin" Value="0,8"/> <Setter Property="Margin" Value="0,0,0,12"/>
<Setter Property="FontSize" Value="15"/>
<Setter Property="FontWeight" Value="SemiBold"/> <Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Background" Value="{StaticResource PanelBackgroundBrush}"/>
</Style> </Style>
<Style TargetType="TextBox"> <Style TargetType="TextBox">
<Setter Property="Height" Value="30"/> <Setter Property="Width" Value="110"/>
<Setter Property="Padding" Value="6,2"/> <Setter Property="Height" Value="36"/>
<Setter Property="Padding" Value="8,2"/>
<Setter Property="VerticalContentAlignment" Value="Center"/> <Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="BorderBrush" Value="#B8C4D4"/> <Setter Property="BorderBrush" Value="#B7C4D2"/>
<Setter Property="BorderThickness" Value="1"/> <Setter Property="BorderThickness" Value="1"/>
<Setter Property="FontSize" Value="15"/>
</Style>
<Style TargetType="RadioButton">
<Setter Property="FontSize" Value="15"/>
<Setter Property="Margin" Value="0,0,22,0"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>
<Style TargetType="TextBlock" x:Key="ParamLabel">
<Setter Property="Width" Value="150"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Foreground" Value="{StaticResource LabelBrush}"/>
<Setter Property="FontSize" Value="15"/>
<Setter Property="FontWeight" Value="Normal"/>
</Style>
<Style TargetType="StackPanel" x:Key="ParamRow">
<Setter Property="Orientation" Value="Horizontal"/>
<Setter Property="Margin" Value="0,6,26,6"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
<Style TargetType="Border" x:Key="MetricCard">
<Setter Property="Background" Value="{StaticResource SubtleBackgroundBrush}"/>
<Setter Property="BorderBrush" Value="#E0E7EF"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="CornerRadius" Value="6"/>
<Setter Property="Padding" Value="12,10"/>
<Setter Property="Margin" Value="6"/>
<Setter Property="MinHeight" Value="86"/>
</Style>
<Style TargetType="TextBlock" x:Key="MetricLabel">
<Setter Property="Foreground" Value="{StaticResource LabelBrush}"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="FontWeight" Value="Normal"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="TextAlignment" Value="Center"/>
<Setter Property="TextWrapping" Value="Wrap"/>
</Style>
<Style TargetType="TextBlock" x:Key="MetricValue">
<Setter Property="Foreground" Value="{StaticResource ValueBrush}"/>
<Setter Property="FontSize" Value="26"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="TextAlignment" Value="Center"/>
<Setter Property="Margin" Value="0,8,0,0"/>
</Style>
<Style TargetType="WrapPanel" x:Key="CommandBar">
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Margin" Value="0,8,0,0"/>
</Style> </Style>
<!-- 四功能测试工作区模板 -->
<DataTemplate x:Key="StationCardTemplate"> <DataTemplate x:Key="StationCardTemplate">
<Border BorderBrush="#D7DEE8" BorderThickness="1" CornerRadius="8" Margin="0" Padding="8,6,8,8" <Border BorderBrush="{StaticResource PanelBorderBrush}"
Background="White" Effect="{StaticResource DropShadowLight}"> BorderThickness="1"
<StackPanel> CornerRadius="8"
<TextBlock Text="{Binding LocalAlarm}" FontWeight="Bold" Margin="0,0,0,6" HorizontalAlignment="Center"> Padding="12"
Background="White"
Effect="{StaticResource DropShadowLight}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Text="{Binding LocalAlarm}"
FontSize="15"
FontWeight="SemiBold"
Margin="0,0,0,8"
HorizontalAlignment="Center">
<TextBlock.Style> <TextBlock.Style>
<Style TargetType="TextBlock"> <Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Red"/> <Setter Property="Foreground" Value="#C62828"/>
<Setter Property="Visibility" Value="Visible"/> <Setter Property="Visibility" Value="Visible"/>
<Style.Triggers> <Style.Triggers>
<DataTrigger Binding="{Binding LocalAlarm}" Value="{x:Null}"> <DataTrigger Binding="{Binding LocalAlarm}" Value="{x:Null}">
@@ -102,281 +211,316 @@
<DataTrigger Binding="{Binding LocalAlarm}" Value=""> <DataTrigger Binding="{Binding LocalAlarm}" Value="">
<Setter Property="Visibility" Value="Collapsed"/> <Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger> </DataTrigger>
<!-- 当文本包含“合格”时变为绿色 -->
<DataTrigger Binding="{Binding LocalAlarm}" Value="硬度测试合格"> <DataTrigger Binding="{Binding LocalAlarm}" Value="硬度测试合格">
<Setter Property="Foreground" Value="Green"/> <Setter Property="Foreground" Value="#2E7D32"/>
</DataTrigger> </DataTrigger>
<DataTrigger Binding="{Binding LocalAlarm}" Value="脆碎度测试合格"> <DataTrigger Binding="{Binding LocalAlarm}" Value="脆碎度测试合格">
<Setter Property="Foreground" Value="Green"/> <Setter Property="Foreground" Value="#2E7D32"/>
</DataTrigger> </DataTrigger>
<DataTrigger Binding="{Binding LocalAlarm}" Value="崩解测试合格"> <DataTrigger Binding="{Binding LocalAlarm}" Value="崩解测试合格">
<Setter Property="Foreground" Value="Green"/> <Setter Property="Foreground" Value="#2E7D32"/>
</DataTrigger> </DataTrigger>
<DataTrigger Binding="{Binding LocalAlarm}" Value="溶出测试合格"> <DataTrigger Binding="{Binding LocalAlarm}" Value="溶出测试合格">
<Setter Property="Foreground" Value="Green"/> <Setter Property="Foreground" Value="#2E7D32"/>
</DataTrigger> </DataTrigger>
<DataTrigger Binding="{Binding LocalAlarm}" Value="溶出1测试合格"> <DataTrigger Binding="{Binding LocalAlarm}" Value="溶出1测试合格">
<Setter Property="Foreground" Value="Green"/> <Setter Property="Foreground" Value="#2E7D32"/>
</DataTrigger> </DataTrigger>
<DataTrigger Binding="{Binding LocalAlarm}" Value="溶出2测试合格"> <DataTrigger Binding="{Binding LocalAlarm}" Value="溶出2测试合格">
<Setter Property="Foreground" Value="Green"/> <Setter Property="Foreground" Value="#2E7D32"/>
</DataTrigger> </DataTrigger>
</Style.Triggers> </Style.Triggers>
</Style> </Style>
</TextBlock.Style> </TextBlock.Style>
</TextBlock> </TextBlock>
<TabControl FontSize="13" BorderThickness="0"> <TabControl Grid.Row="1" FontSize="13" BorderThickness="0">
<!-- ========== 硬度测试 ========== -->
<TabItem Header="硬度测试"> <TabItem Header="硬度测试">
<Grid Margin="4,6,4,4"> <Grid Margin="4,14,4,4">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/> <RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<!-- 参数设置区 --> <GroupBox Header="测试参数设置" Grid.Row="0">
<GroupBox Header="测试参数设置" Grid.Row="0" Margin="0,5"> <WrapPanel>
<UniformGrid Columns="1" Rows="2" Margin="10"> <StackPanel Style="{StaticResource ParamRow}">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="0,10,0,0" > <TextBlock Text="试验次数设定:" Style="{StaticResource ParamLabel}"/>
<TextBlock Text="试验次数设定:" Width="100" VerticalAlignment="Center"/> <TextBox Text="{Binding HardnessTestCount, UpdateSourceTrigger=PropertyChanged}"/>
<TextBox Text="{Binding HardnessTestCount, UpdateSourceTrigger=PropertyChanged}" Width="80"/>
</StackPanel> </StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="0,10,0,0"> <StackPanel Style="{StaticResource ParamRow}">
<TextBlock Text="试验次数间隔(秒)" Width="100" VerticalAlignment="Center"/> <TextBlock Text="试验次数间隔(秒)" Style="{StaticResource ParamLabel}"/>
<TextBox Text="{Binding HardnessIntervalSec, UpdateSourceTrigger=PropertyChanged}" Width="80"/> <TextBox Text="{Binding HardnessIntervalSec, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel> </StackPanel>
</UniformGrid> </WrapPanel>
</GroupBox> </GroupBox>
<!-- 测试结果区 --> <Grid Grid.Row="1">
<GroupBox Header="测试结果" Grid.Row="1" Margin="0,5"> <Grid.RowDefinitions>
<UniformGrid Columns="3" Rows="1" Margin="10"> <RowDefinition Height="Auto"/>
<StackPanel HorizontalAlignment="Center"> <RowDefinition Height="Auto"/>
<TextBlock Text="最大值(N)" FontWeight="SemiBold" HorizontalAlignment="Center"/> </Grid.RowDefinitions>
<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="0">
<GroupBox Header="参数状态显示" Grid.Row="2" Margin="0,5"> <UniformGrid Columns="3">
<UniformGrid Columns="2" Rows="1" Margin="10"> <Border Style="{StaticResource MetricCard}">
<StackPanel> <StackPanel>
<TextBlock Text="试验次数" HorizontalAlignment="Center"/> <TextBlock Text="最大值(N)" Style="{StaticResource MetricLabel}"/>
<TextBlock Text="{Binding HardnessCurrentCount, StringFormat=F0}" FontSize="18" HorizontalAlignment="Center"/> <TextBlock Text="{Binding HardnessMax, StringFormat=F1}" Foreground="#1565C0" Style="{StaticResource MetricValue}"/>
</StackPanel> </StackPanel>
<StackPanel> </Border>
<TextBlock Text="测试力值(N)" HorizontalAlignment="Center"/> <Border Style="{StaticResource MetricCard}">
<TextBlock Text="{Binding HardnessValue, StringFormat=F1}" FontSize="18" Foreground="#FF9800" HorizontalAlignment="Center"/> <StackPanel>
</StackPanel> <TextBlock Text="最小值(N)" Style="{StaticResource MetricLabel}"/>
</UniformGrid> <TextBlock Text="{Binding HardnessMin, StringFormat=F1}" Foreground="#1565C0" Style="{StaticResource MetricValue}"/>
</GroupBox> </StackPanel>
</Border>
<Border Style="{StaticResource MetricCard}">
<StackPanel>
<TextBlock Text="平均值(N)" Style="{StaticResource MetricLabel}"/>
<TextBlock Text="{Binding HardnessAvg, StringFormat=F1}" Foreground="#2E7D32" Style="{StaticResource MetricValue}"/>
</StackPanel>
</Border>
</UniformGrid>
</GroupBox>
<!-- 按钮区 --> <GroupBox Header="参数状态显示" Grid.Row="1">
<WrapPanel Grid.Row="3" HorizontalAlignment="Center" Margin="0,10"> <UniformGrid Columns="2">
<!--<Button Command="{Binding HardnessUpCommand}" Content="梁杆上升" Style="{StaticResource ActionButton}" Background="#FF9800" Margin="5 10 5 10"/> <Border Style="{StaticResource MetricCard}">
<Button Command="{Binding HardnessDownCommand}" Content="梁杆下降" Style="{StaticResource ActionButton}" Background="#FF9800"/>--> <StackPanel>
<Button Command="{Binding HardnessResetCommand}" Content="复位" Style="{StaticResource ActionButton}" Background="#9E9E9E"/> <TextBlock Text="试验次数" Style="{StaticResource MetricLabel}"/>
<Button Command="{Binding PrintHardnessCommand}" Content="打印" Style="{StaticResource ActionButton}" Background="#607D8B"/> <TextBlock Text="{Binding HardnessCurrentCount, StringFormat=F0}" Style="{StaticResource MetricValue}"/>
<Button Command="{Binding StartHardnessCommand}" Content="启动测试" Style="{StaticResource ActionButton}" Background="#4CAF50" Margin="5 0 0 0"/> </StackPanel>
<Button Command="{Binding StopHardnessCommand}" Content="测试停止" Style="{StaticResource ActionButton}" Background="#F44336"/> </Border>
<Border Style="{StaticResource MetricCard}">
<StackPanel>
<TextBlock Text="测试力值(N)" Style="{StaticResource MetricLabel}"/>
<TextBlock Text="{Binding HardnessValue, StringFormat=F1}" Foreground="#D98200" Style="{StaticResource MetricValue}"/>
</StackPanel>
</Border>
</UniformGrid>
</GroupBox>
</Grid>
<WrapPanel Grid.Row="2" Style="{StaticResource CommandBar}">
<Button Command="{Binding HardnessResetCommand}" Content="复位" Style="{StaticResource ResetButton}"/>
<Button Command="{Binding PrintHardnessCommand}" Content="打印" Style="{StaticResource SecondaryButton}"/>
<Button Command="{Binding StartHardnessCommand}" Content="启动测试" Style="{StaticResource StartButton}"/>
<Button Command="{Binding StopHardnessCommand}" Content="测试停止" Style="{StaticResource StopButton}"/>
</WrapPanel> </WrapPanel>
</Grid> </Grid>
</TabItem> </TabItem>
<!-- ========== 脆碎度测试 ========== -->
<TabItem Header="脆碎度测试"> <TabItem Header="脆碎度测试">
<Grid Margin="4,6,4,4"> <Grid Margin="4,14,4,4">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<GroupBox Header="测试参数设置" Grid.Row="0" Margin="0,5"> <GroupBox Header="测试参数设置" Grid.Row="0">
<UniformGrid Columns="1" Rows="3" Margin="10" > <WrapPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="0,15,0,0" > <StackPanel Style="{StaticResource ParamRow}">
<TextBlock Text="转速设置(r/min)" Width="110" VerticalAlignment="Center"/> <TextBlock Text="转速设置(r/min)" Style="{StaticResource ParamLabel}"/>
<TextBox Text="{Binding FriabilityTargetRpm, UpdateSourceTrigger=PropertyChanged}" Width="100"/> <TextBox Text="{Binding FriabilityTargetRpm, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel> </StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="0,15,0,0" > <StackPanel Style="{StaticResource ParamRow}">
<TextBlock Text="转数设置(秒)" Width="110" VerticalAlignment="Center"/> <TextBlock Text="转数设置(秒)" Style="{StaticResource ParamLabel}"/>
<TextBox Text="{Binding FriabilityTargetTimeSec, UpdateSourceTrigger=PropertyChanged}" Width="100"/> <TextBox Text="{Binding FriabilityTargetTimeSec, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel> </StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="0,10,0,0" Width="280" > <StackPanel Style="{StaticResource ParamRow}">
<TextBlock Text="方向:" Width="80" VerticalAlignment="Center" Margin="0 10 0 0"/> <TextBlock Text="方向:" Style="{StaticResource ParamLabel}"/>
<RadioButton Content="顺时针" IsChecked="{Binding FriabilityClockwise}" Margin="0,10,10,0"/> <RadioButton Content="顺时针" IsChecked="{Binding FriabilityClockwise}"/>
<RadioButton Content="逆时针" IsChecked="{Binding FriabilityCounterClockwise}" Margin="0 10 0 0"/> <RadioButton Content="逆时针" IsChecked="{Binding FriabilityCounterClockwise}"/>
</StackPanel> </StackPanel>
</WrapPanel>
</GroupBox>
<GroupBox Header="参数状态显示" Grid.Row="1">
<UniformGrid Columns="2">
<Border Style="{StaticResource MetricCard}">
<StackPanel>
<TextBlock Text="转速显示(r/min)" Style="{StaticResource MetricLabel}"/>
<TextBlock Text="{Binding FriabilityCurrentRpm, StringFormat=F1}" Style="{StaticResource MetricValue}"/>
</StackPanel>
</Border>
<Border Style="{StaticResource MetricCard}">
<StackPanel>
<TextBlock Text="剩余圈数" Style="{StaticResource MetricLabel}"/>
<TextBlock Text="{Binding FriabilityRemainingRounds}" Foreground="#1565C0" Style="{StaticResource MetricValue}"/>
</StackPanel>
</Border>
</UniformGrid> </UniformGrid>
</GroupBox> </GroupBox>
<GroupBox Header="参数状态显示" Grid.Row="1" Margin="0,45,0,15"> <WrapPanel Grid.Row="2" Style="{StaticResource CommandBar}">
<UniformGrid Columns="2" Rows="1" Margin="10"> <Button Command="{Binding StartFriabilityCommand}" Content="测试启动" Style="{StaticResource StartButton}"/>
<StackPanel> <Button Command="{Binding StopFriabilityCommand}" Content="测试停止" Style="{StaticResource StopButton}"/>
<TextBlock Text="转速显示(r/min)" HorizontalAlignment="Center"/> <Button Command="{Binding ResetFriabilityCommand}" Content="复位" Style="{StaticResource ResetButton}"/>
<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> </WrapPanel>
</Grid> </Grid>
</TabItem> </TabItem>
<!-- ========== 溶出度 ========== -->
<TabItem Header="溶出度"> <TabItem Header="溶出度">
<ScrollViewer VerticalScrollBarVisibility="Auto" <Grid Margin="4,14,4,4">
Height="470">
<Grid Margin="4,6,4,4">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto"/> <RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<GroupBox Header="测试参数设置" Grid.Row="0" Margin="0,5"> <ScrollViewer Grid.Row="0" VerticalScrollBarVisibility="Auto">
<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>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="200"/> <RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
</Grid.RowDefinitions> </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"> <GroupBox Header="测试参数设置" Grid.Row="0">
<Button Command="{Binding StartDissolution1Command}" Content="溶出1开始" Style="{StaticResource ActionButton}" Background="#4CAF50" Margin="5 10 5 10"/> <WrapPanel>
<Button Command="{Binding StopDissolution1Command}" Content="溶出1停止" Style="{StaticResource ActionButton}" Background="#F44336"/> <StackPanel Style="{StaticResource ParamRow}">
<Button Command="{Binding StartDissolution2Command}" Content="溶出2开始" Style="{StaticResource ActionButton}" Background="#4CAF50"/> <TextBlock Text="溶出1时间(min)" Style="{StaticResource ParamLabel}"/>
<Button Command="{Binding StopDissolution2Command}" Content="溶出2停止" Style="{StaticResource ActionButton}" Background="#F44336"/> <TextBox Text="{Binding Dissolution1TimeMin, UpdateSourceTrigger=PropertyChanged}"/>
<!--<Button Command="{Binding PrintDissolutionCommand}" Content="溶出度测试记录" Style="{StaticResource ActionButton}" Background="#607D8B" Margin="5 10 0 0"/>--> </StackPanel>
<StackPanel Style="{StaticResource ParamRow}">
<TextBlock Text="溶出2时间(min)" Style="{StaticResource ParamLabel}"/>
<TextBox Text="{Binding Dissolution2TimeMin, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>
</WrapPanel>
</GroupBox>
<GroupBox Header="测试状态显示" Grid.Row="1">
<UniformGrid Columns="5">
<Border Style="{StaticResource MetricCard}">
<StackPanel>
<TextBlock Text="水浴温度显示(℃)" Style="{StaticResource MetricLabel}"/>
<TextBlock Text="{Binding DisintegrationTemp, StringFormat=F1}" Foreground="#C2185B" Style="{StaticResource MetricValue}"/>
</StackPanel>
</Border>
<Border Style="{StaticResource MetricCard}">
<StackPanel>
<TextBlock Text="试验运行时间(min)" Style="{StaticResource MetricLabel}"/>
<TextBlock Text="{Binding DissolutionElapsedTime, StringFormat=F1}" Style="{StaticResource MetricValue}"/>
</StackPanel>
</Border>
<Border Style="{StaticResource MetricCard}">
<StackPanel>
<TextBlock Text="取样倒计时(min)" Style="{StaticResource MetricLabel}"/>
<TextBlock Text="{Binding DissolutionCountdown, StringFormat=F1}" Foreground="#D98200" Style="{StaticResource MetricValue}"/>
</StackPanel>
</Border>
<Border Style="{StaticResource MetricCard}">
<StackPanel>
<TextBlock Text="溶出1溶出度(%)" Style="{StaticResource MetricLabel}"/>
<TextBlock Text="{Binding Dissolution1Percent, StringFormat=F1}" Foreground="#2E7D32" Style="{StaticResource MetricValue}"/>
</StackPanel>
</Border>
<Border Style="{StaticResource MetricCard}">
<StackPanel>
<TextBlock Text="溶出2溶出度(%)" Style="{StaticResource MetricLabel}"/>
<TextBlock Text="{Binding Dissolution2Percent, StringFormat=F1}" Foreground="#1565C0" Style="{StaticResource MetricValue}"/>
</StackPanel>
</Border>
</UniformGrid>
</GroupBox>
<GroupBox Header="溶出双曲线和R²值" Grid.Row="2">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="240"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<oxy:PlotView Grid.Row="0" Model="{Binding DissolutionPlotModel}" Margin="4"/>
<WrapPanel Grid.Row="1" Margin="4,8,4,2">
<TextBlock Text="{Binding Dissolution1RSquared, StringFormat='溶出1 R² = {0:F4}'}"
FontSize="15"
FontWeight="SemiBold"
Foreground="#2E7D32"
Margin="0,0,28,0"/>
<TextBlock Text="{Binding Dissolution2RSquared, StringFormat='溶出2 R² = {0:F4}'}"
FontSize="15"
FontWeight="SemiBold"
Foreground="#1565C0"/>
</WrapPanel>
<TextBlock Grid.Row="2"
Text="{Binding DissolutionCurveStatus}"
Foreground="#C62828"
FontWeight="SemiBold"
Margin="4,4,4,0"
TextWrapping="Wrap"/>
</Grid>
</GroupBox>
</Grid>
</ScrollViewer>
<WrapPanel Grid.Row="1" Style="{StaticResource CommandBar}">
<Button Command="{Binding StartDissolution1Command}" Content="溶出1开始" Style="{StaticResource StartButton}"/>
<Button Command="{Binding StopDissolution1Command}" Content="溶出1停止" Style="{StaticResource StopButton}"/>
<Button Command="{Binding StartDissolution2Command}" Content="溶出2开始" Style="{StaticResource StartButton}"/>
<Button Command="{Binding StopDissolution2Command}" Content="溶出2停止" Style="{StaticResource StopButton}"/>
</WrapPanel> </WrapPanel>
</Grid> </Grid>
</ScrollViewer>
</TabItem> </TabItem>
<!-- ========== 崩解时限 ========== -->
<TabItem Header="崩解时限"> <TabItem Header="崩解时限">
<Grid Margin="4,6,4,4"> <Grid Margin="4,14,4,4">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/> <RowDefinition Height="*"/>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<GroupBox Header="测试参数设置" Grid.Row="0" Margin="0,5"> <GroupBox Header="测试参数设置" Grid.Row="0">
<UniformGrid Columns="1" Rows="2" Margin="10"> <WrapPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left"> <StackPanel Style="{StaticResource ParamRow}">
<TextBlock Text="崩速度(r/min)" Width="130" VerticalAlignment="Center"/> <TextBlock Text="崩速度(r/min)" Style="{StaticResource ParamLabel}"/>
<TextBox Text="{Binding DisintegrationSpeedRpm, UpdateSourceTrigger=PropertyChanged}" Width="80"/> <TextBox Text="{Binding DisintegrationSpeedRpm, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel> </StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left"> <StackPanel Style="{StaticResource ParamRow}">
<TextBlock Text="崩解时间(min)" Width="130" VerticalAlignment="Center"/> <TextBlock Text="崩解时间(min)" Style="{StaticResource ParamLabel}"/>
<TextBox Text="{Binding DisintegrationTimeMin, UpdateSourceTrigger=PropertyChanged}" Width="80"/> <TextBox Text="{Binding DisintegrationTimeMin, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel> </StackPanel>
</WrapPanel>
</GroupBox>
<GroupBox Header="测试状态显示" Grid.Row="1">
<UniformGrid Columns="3">
<Border Style="{StaticResource MetricCard}">
<StackPanel>
<TextBlock Text="水浴温度显示(℃)" Style="{StaticResource MetricLabel}"/>
<TextBlock Text="{Binding DisintegrationTemp, StringFormat=F1}" Foreground="#C2185B" Style="{StaticResource MetricValue}"/>
</StackPanel>
</Border>
<Border Style="{StaticResource MetricCard}">
<StackPanel>
<TextBlock Text="试验运行时间(秒)" Style="{StaticResource MetricLabel}"/>
<TextBlock Text="{Binding DisintegrationSeconds}" Style="{StaticResource MetricValue}"/>
</StackPanel>
</Border>
<Border Style="{StaticResource MetricCard}">
<StackPanel>
<TextBlock Text="剩余未崩解管数" Style="{StaticResource MetricLabel}"/>
<TextBlock Text="{Binding RemainingTubes}" Foreground="#C62828" Style="{StaticResource MetricValue}"/>
</StackPanel>
</Border>
</UniformGrid> </UniformGrid>
</GroupBox> </GroupBox>
<GroupBox Header="测试状态显示" Grid.Row="1" Margin="0,5"> <WrapPanel Grid.Row="2" Style="{StaticResource CommandBar}">
<UniformGrid Columns="3" Rows="1" Margin="10"> <Button Command="{Binding StartDisintegrationCommand}" Content="测试启动" Style="{StaticResource StartButton}"/>
<StackPanel> <Button Command="{Binding StopDisintegrationCommand}" Content="测试停止" Style="{StaticResource StopButton}"/>
<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> </WrapPanel>
</Grid> </Grid>
</TabItem> </TabItem>
</TabControl> </TabControl>
</StackPanel> </Grid>
</Border> </Border>
</DataTemplate> </DataTemplate>
</Window.Resources> </Window.Resources>
<!-- 主布局 -->
<Grid Margin="10"> <Grid Margin="10">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
@@ -384,13 +528,14 @@
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<!-- 标题栏 -->
<Border Background="#0F3D68" CornerRadius="6" Margin="0,0,0,8" Padding="12,10"> <Border Background="#0F3D68" CornerRadius="6" Margin="0,0,0,8" Padding="12,10">
<Grid> <Grid>
<TextBlock Text="CSI-Z420 片剂四用仪 硬度 · 脆碎度 · 溶出 · 崩解" <TextBlock Text="CSI-Z420 片剂四用仪 硬度 · 脆碎度 · 溶出 · 崩解"
FontSize="22" FontWeight="Bold" Foreground="White" VerticalAlignment="Center"/> FontSize="22"
FontWeight="Bold"
Foreground="White"
VerticalAlignment="Center"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" 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 OpenHistoryCommand}" Content="历史记录" Style="{StaticResource ActionButton}"/>
<Button Command="{Binding OpenCalibrationCommand}" Content="校准" Style="{StaticResource ActionButton}"/> <Button Command="{Binding OpenCalibrationCommand}" Content="校准" Style="{StaticResource ActionButton}"/>
<Button Command="{Binding ExportAllCommand}" Content="导出报告" Style="{StaticResource ActionButton}"/> <Button Command="{Binding ExportAllCommand}" Content="导出报告" Style="{StaticResource ActionButton}"/>
@@ -398,12 +543,13 @@
</Grid> </Grid>
</Border> </Border>
<!-- 四功能测试工作区 --> <ContentControl Grid.Row="1"
<ContentControl Grid.Row="1" Margin="0,0,0,16" Margin="0,0,0,16"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Stretch"
Content="{Binding Tester}" Content="{Binding Tester}"
ContentTemplate="{StaticResource StationCardTemplate}"/> ContentTemplate="{StaticResource StationCardTemplate}"/>
<!-- 状态栏 -->
<StatusBar Grid.Row="2" Background="#FFF" BorderBrush="#DDD" BorderThickness="0,1,0,0" Padding="8"> <StatusBar Grid.Row="2" Background="#FFF" BorderBrush="#DDD" BorderThickness="0,1,0,0" Padding="8">
<StatusBarItem> <StatusBarItem>
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
@@ -425,15 +571,13 @@
<TextBlock Text="⚠ " Foreground="#FF5722"/> <TextBlock Text="⚠ " Foreground="#FF5722"/>
<TextBlock Text="{Binding GlobalAlarm}" Foreground="Red"/> <TextBlock Text="{Binding GlobalAlarm}" Foreground="Red"/>
</StackPanel> </StackPanel>
</StatusBarItem> </StatusBarItem>
<!-- 透明的点击区域:完全看不到,但是能响应点击 --> <Button Background="Transparent"
<Button Background="Transparent" Margin="10" Width="80" Height="30" BorderThickness="0"
Command="{Binding ShowDataCommand}"> Margin="10"
Width="80"
</Button> Height="30"
Command="{Binding ShowDataCommand}"/>
</StatusBar> </StatusBar>
</Grid> </Grid>
</Window> </Window>