From 559890c482f5973f06aafdfec9550fee5ba3c7f2 Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期一, 09 十一月 2026 17:02:15 +0800
Subject: [PATCH] feat: CAN 模拟器 TCP 化 + 多设备并发调试 + 后台生命周期管理

---
 Plugin.TsExecution/TsExecution.xaml |  279 ++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 223 insertions(+), 56 deletions(-)

diff --git a/Plugin.TsExecution/TsExecution.xaml b/Plugin.TsExecution/TsExecution.xaml
index ced5ec4..ee28281 100644
--- a/Plugin.TsExecution/TsExecution.xaml
+++ b/Plugin.TsExecution/TsExecution.xaml
@@ -1,43 +1,187 @@
-锘�<hb:PluginControl x:Class="Plugin.TsExecution.TsExecution"
+锘�<hb:PluginMaskControl x:Class="Plugin.TsExecution.TsExecution"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
              xmlns:local="clr-namespace:Plugin.TsExecution"
-             xmlns:hb="clr-namespace:HMI.Base;assembly=HMI.Base"
-         xmlns:uic="clr-namespace:HMI.UI.Converter;assembly=HMI.UI"
-         xmlns:pw="https://opensource.panuon.com/wpf"
-         xmlns:pu="https://opensource.panuon.com/wpf-ui"
-         xmlns:dp="clr-namespace:HMI.UI.DpUtil;assembly=HMI.UI"
-         xmlns:ScottPlot="clr-namespace:ScottPlot.WPF;assembly=ScottPlot.WPF"
          mc:Ignorable="d" 
-         Padding="10"
+         xmlns:hb="clr-namespace:HMI.Base;assembly=HMI.Base"
+        xmlns:uic="clr-namespace:HMI.UI.Converter;assembly=HMI.UI"
+        xmlns:pw="https://opensource.panuon.com/wpf"
+        xmlns:pu="https://opensource.panuon.com/wpf-ui"
+        xmlns:dp="clr-namespace:HMI.UI.DpUtil;assembly=HMI.UI"
+        xmlns:ScottPlot="clr-namespace:ScottPlot.WPF;assembly=ScottPlot.WPF"
+         xmlns:sys="clr-namespace:System;assembly=mscorlib"
+         xmlns:ui="clr-namespace:HMI.UI;assembly=HMI.UI"
+         Padding="2,5,2,5"
          Loaded="PluginControl_Loaded"
-                  SizeChanged="PluginControl_SizeChanged"
-         Background="{StaticResource WorkspaceBackground}"
+         SizeChanged="PluginControl_SizeChanged"
+         Background="{DynamicResource WorkspaceBackground}"
          d:DesignHeight="450" d:DesignWidth="800">
+    <UserControl.Resources>
+        <ResourceDictionary>
+            <sys:Double x:Key="tableFontSize">20</sys:Double>
+            <Style x:Key="FormComboxStyle" TargetType="ComboBox" BasedOn="{StaticResource FormComboxStyle}">
+                <Setter Property="Height" Value="28"/>
+            </Style>
+        </ResourceDictionary>
+    </UserControl.Resources>
+
     <Grid>
-        <Grid.ColumnDefinitions>
-            <ColumnDefinition Width="8*"/>
-            <ColumnDefinition Width="2*"/>
-        </Grid.ColumnDefinitions>
-        <WindowsFormsHost x:Name="host" Visibility="Collapsed"></WindowsFormsHost>
-        <Border>
-            <UniformGrid x:Name="panel" Columns="2" dp:UniformGridHelper.InnerBorder="1" 
-                         dp:UniformGridHelper.InnerBorderBrush="{StaticResource CommonBoarder}">
+        <Grid>
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition />
+                <ColumnDefinition Width="Auto"/>
+            </Grid.ColumnDefinitions>
 
-            </UniformGrid>
-        </Border>
-
-        <Grid Grid.Column="1">
             <Grid.RowDefinitions>
                 <RowDefinition Height="Auto"/>
-                <RowDefinition Height="Auto"/>
-                <RowDefinition />
-                <RowDefinition Height="Auto"/>
+                <RowDefinition/>
             </Grid.RowDefinitions>
+            <WindowsFormsHost x:Name="host" Visibility="Collapsed"></WindowsFormsHost>
 
-            <GroupBox>
+            <DockPanel Grid.Row="0" Grid.ColumnSpan="2" Margin="5,0,5,0" LastChildFill="False">
+                <DockPanel.Resources>
+                    <Style TargetType="CheckBox">
+                        <Setter Property="FontSize" Value="20"/>
+                        <Setter Property="VerticalContentAlignment" Value="Center"/>
+                    </Style>
+                </DockPanel.Resources>
+
+                <StackPanel Orientation="Horizontal" VerticalAlignment="Center" dp:StackPanelHelper.ChildSpace="10">
+                    <pu:FormGroup HeaderHeight="Auto" HeaderPadding="0" x:Name="selectModelPanel">
+                        <pu:FormGroup.Header>
+                            <TextBlock FontSize="20" Foreground="#000" Text="{DynamicResource Ts.SelectProductModel}"/>
+                        </pu:FormGroup.Header>
+                        <ComboBox Style="{StaticResource FormComboxStyle}" MinWidth="180" ItemsSource="{Binding Products}"
+DisplayMemberPath="Name" SelectedValuePath="Name"
+SelectedItem="{Binding SelectedProduct}" x:Name="CbProduct"/>
+                    </pu:FormGroup>
+
+                    <pu:FormGroup HeaderHeight="Auto" HeaderPadding="0" x:Name="autoModelPanel" Visibility="Collapsed">
+                        <pu:FormGroup.Header>
+                            <TextBlock FontSize="20" Foreground="#000" Text="褰撳墠浜у搧"/>
+                        </pu:FormGroup.Header>
+                        <TextBox Style="{StaticResource EditorTextBoxStyle}" IsReadOnly="True" MinWidth="180" Text="{Binding CurrentProductModel}"/>
+                    </pu:FormGroup>
+
+                    <CheckBox x:Name="CbEnableMes"
+        IsChecked="{Binding EnableMes,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
+        Content="{DynamicResource Ts.EnableMes}"
+        />
+                    <CheckBox x:Name="CbEnableNGPause"
+              IsChecked="{Binding EnableNGPause,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
+              Content="{DynamicResource Ts.EnableNGPause}"
+              />
+                    <CheckBox x:Name="CbEnableDebugMode"
+              IsChecked="{Binding EnableDebugMode,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
+              Content="{DynamicResource Ts.DebugMode}"/>
+
+                    <CheckBox x:Name="CbDisableScanner"
+IsChecked="{Binding DisableScanner,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
+Content="{DynamicResource Ts.BlockScanner}"/>
+
+                    <CheckBox x:Name="CbEnableSimpleMode"
+IsChecked="{Binding EnableSimpleMode,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
+Content="{DynamicResource Ts.EnableSimpleMode}"/>
+
+                    <CheckBox x:Name="CbUI_ShowInfoDock"
+IsChecked="{Binding UI_ShowInfoDock,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
+Content="{DynamicResource Ts.UI_ShowInfoDock}"/>
+
+                    <CheckBox FontSize="20" x:Name="Cb_ManualDebug"  Visibility="Collapsed"
+                              IsChecked="{Binding EnableManualDebug,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
+                              VerticalContentAlignment="Center" Content="鎵嬪姩璋冭瘯" />
+
+                    <StackPanel Orientation="Horizontal" dp:StackPanelHelper.ChildSpace="5">
+                        <Label FontSize="20" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Padding="0"
+                       Content="{DynamicResource HMI.User.Code}" />
+                        <Label FontSize="20" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Padding="0" 
+                       Content="{Binding CurrentUserCode}" />
+                    </StackPanel>
+
+
+                    <Label x:Name="workorderPanel" VerticalContentAlignment="Center" Visibility="Collapsed" Padding="0" Margin="0" MouseDoubleClick="Label_MouseDoubleClick">
+                        <StackPanel Orientation="Horizontal"
+                                dp:StackPanelHelper.ChildSpace="5">
+                            <Label FontSize="20" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Padding="0" 
+                                   Content="{DynamicResource Ts.WorkOrder}"/>
+                            <TextBlock x:Name="TbWorkOrder" FontSize="20" MinWidth="50" Text="{Binding CurrentWorkorder}"/>
+                            <!--<ui:EditBox FontSize="20" x:Name="workOrderEditor" MinWidth="50"
+                                CanEdit="True"
+                                ShowEmpty="True"
+                                PreEditing="RequirePassword"
+                                Value="{Binding CurrentWorkorder,Mode=TwoWay}"/>-->
+                        </StackPanel>
+                    </Label>
+
+                    <!--<StackPanel Orientation="Horizontal" dp:StackPanelHelper.ChildSpace="5">
+                        <Label FontSize="20" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Padding="0" Content="瀛椾綋澶у皬"/>
+                        <ComboBox Name="CbFontSize" Width="60" ItemsSource="{Binding FontSizeSource}" 
+                                  SelectionChanged="CbFontSize_SelectionChanged"/>
+                    </StackPanel>-->
+                </StackPanel>
+
+
+
+                <StackPanel DockPanel.Dock="Right" Orientation="Horizontal" dp:StackPanelHelper.ChildSpace="10">
+                    <Button Style="{StaticResource SuccessButton}" 
+x:Name="BtnStartSeq" Click="Button_Click" 
+Content="{DynamicResource Ts.BtnStartSeq}"/>
+                    <Button Grid.Row="1" Style="{StaticResource DangerButton}" IsEnabled="False"
+x:Name="BtnStopSeq" Click="Button_Click"
+Content="{DynamicResource Ts.BtnStopSeq}"/>
+                    <Button Grid.Row="2" Style="{StaticResource PrimaryButton}" 
+x:Name="BtnClearNum" Click="Button_Click"
+Content="{DynamicResource Ts.BtnClearNum}"/>
+                    <Button Grid.Row="3"
+x:Name="BtnSample" Click="Button_Click">
+                        <Button.Style>
+                            <Style TargetType="Button" BasedOn="{StaticResource PrimaryButton}">
+                                <Style.Triggers>
+                                    <DataTrigger Binding="{Binding SampleStatus}" Value="True">
+                                        <Setter Property="Content" Value="{DynamicResource Ts.BtnIsSample}"/>
+                                    </DataTrigger>
+                                    <DataTrigger Binding="{Binding SampleStatus}" Value="False">
+                                        <Setter Property="Content" Value="{DynamicResource Ts.BtnNotSample}"/>
+                                    </DataTrigger>
+                                </Style.Triggers>
+                            </Style>
+                        </Button.Style>
+                    </Button>
+                </StackPanel>
+            </DockPanel>
+
+            <Grid dp:GridHelper.Space="5" Grid.Row="1">
+                <Grid.RowDefinitions>
+                    <RowDefinition Height="Auto"/>
+                    <RowDefinition/>
+                    <RowDefinition Height="Auto"/>
+                </Grid.RowDefinitions>
+
+
+                <UniformGrid x:Name="panel" Grid.Row="1" Columns="2" dp:UniformGridHelper.InnerBorder="1"
+                         dp:UniformGridHelper.InnerBorderBrush="#3a3a3a">
+
+
+                </UniformGrid>
+                <!--<Border x:Name="alarmPanel" Height="80" VerticalAlignment="Bottom" Visibility="Visible" Background="Red"/>
+                <Border Grid.Row="1" x:Name="alarmPanel" Visibility="{Binding AlarmVisiable,Converter={StaticResource vbConverter}}" 
+                     Height="50" Background="Red"/>-->
+            </Grid>
+
+
+
+            <Grid Grid.Row="1" Grid.Column="1" x:Name="detailPanel">
+                <Grid.RowDefinitions>
+                    <RowDefinition Height="Auto"/>
+                    <RowDefinition Height="Auto"/>
+                    <RowDefinition Height="Auto"/>
+                    <RowDefinition />
+                    <RowDefinition Height="Auto"/>
+                </Grid.RowDefinitions>
+
+                <!--<GroupBox>
                 <pu:FormGroup Orientation="Vertical" 
                               HeaderHeight="Auto"
                               HeaderPadding="0" Header="{DynamicResource Ts.SelectProductModel}">
@@ -47,39 +191,62 @@
           SelectedItem="{Binding SelectedProduct}"
           x:Name="CbProduct"/>
                 </pu:FormGroup>
-            </GroupBox>
+            </GroupBox>-->
 
-            <GroupBox Grid.Row="1">
-                <StackPanel>
-                    <pu:FormGroup Header="{DynamicResource Ts.Total}" GroupName="Number">
-                        <TextBox Style="{StaticResource EditorTextBoxStyle}"  IsReadOnly="True"
+                <GroupBox Grid.Row="2">
+                    <StackPanel>
+                        <pu:FormGroup Header="{DynamicResource Ts.MesStatus}" GroupName="Number">
+                            <Label Grid.Row="1">
+                                <Label.Style>
+                                    <Style TargetType="Label">
+                                        <Setter Property="Foreground" Value="#FFF"/>
+                                        <Setter Property="HorizontalContentAlignment" Value="Center"/>
+                                        <Setter Property="FontSize" Value="16"/>
+                                        <Setter Property="FontWeight" Value="Bold"/>
+                                        <Style.Triggers>
+                                            <DataTrigger Binding="{Binding EnableMes}" Value="True">
+                                                <Setter Property="Background" Value="Green"/>
+                                                <Setter Property="Content" Value="{DynamicResource Ts.MesStatus.Enable}"/>
+                                            </DataTrigger>
+                                            <DataTrigger Binding="{Binding EnableMes}" Value="False">
+                                                <Setter Property="Background" Value="Red"/>
+                                                <Setter Property="Content" Value="{DynamicResource Ts.MesStatus.Disable}"/>
+                                            </DataTrigger>
+                                        </Style.Triggers>
+                                    </Style>
+                                </Label.Style>
+                            </Label>
+                        </pu:FormGroup>
+                        <pu:FormGroup Header="{DynamicResource Ts.Total}" GroupName="Number">
+                            <TextBox Style="{StaticResource EditorTextBoxStyle}"  IsReadOnly="True"
                  x:Name="TbTotal"/>
-                    </pu:FormGroup>
-                    <pu:FormGroup Header="{DynamicResource Ts.Pass}" GroupName="Number">
-                        <TextBox Style="{StaticResource EditorTextBoxStyle}" IsReadOnly="True"
+                        </pu:FormGroup>
+                        <pu:FormGroup Header="{DynamicResource Ts.Pass}" GroupName="Number">
+                            <TextBox Style="{StaticResource EditorTextBoxStyle}" IsReadOnly="True"
                  x:Name="TbPass"/>
-                    </pu:FormGroup>
-                    <pu:FormGroup Header="{DynamicResource Ts.Fail}" GroupName="Number">
-                        <TextBox Style="{StaticResource EditorTextBoxStyle}" IsReadOnly="True"
+                        </pu:FormGroup>
+                        <pu:FormGroup Header="{DynamicResource Ts.Fail}" GroupName="Number">
+                            <TextBox Style="{StaticResource EditorTextBoxStyle}" IsReadOnly="True"
                  x:Name="TbFail"/>
-                    </pu:FormGroup>
-                    <pu:FormGroup Header="{DynamicResource Ts.PassRate}" GroupName="Number">
-                        <TextBox Style="{StaticResource EditorTextBoxStyle}" IsReadOnly="True"
+                        </pu:FormGroup>
+                        <pu:FormGroup Header="{DynamicResource Ts.PassRate}" GroupName="Number">
+                            <TextBox Style="{StaticResource EditorTextBoxStyle}" IsReadOnly="True"
                  x:Name="TbPassRate"/>
-                    </pu:FormGroup>
-                </StackPanel>
-            </GroupBox>
+                        </pu:FormGroup>
+                    </StackPanel>
+                </GroupBox>
 
-            <GroupBox Grid.Row="2">
-                <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
-                    <ScottPlot:WpfPlot Background="Transparent" x:Name="pieChart" MinWidth="300" MinHeight="300"
+                <GroupBox Grid.Row="3">
+                    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
+                        <ScottPlot:WpfPlot Background="Transparent" x:Name="pieChart" MinWidth="300" MinHeight="300"
                    SizeChanged="PluginControl_SizeChanged"/>
-                </ScrollViewer>
-            </GroupBox>
+                    </ScrollViewer>
+                </GroupBox>
 
-            <GroupBox Grid.Row="3">
+                <!-- <GroupBox Grid.Row="4">
                 <Grid dp:GridHelper.Space="20">
                     <Grid.RowDefinitions>
+                        <RowDefinition/>
                         <RowDefinition/>
                         <RowDefinition/>
                         <RowDefinition/>
@@ -110,8 +277,8 @@
                         </Button.Style>
                     </Button>
 
-                    <!--<pu:Switch Grid.Row="3" BoxWidth="120"
-    CheckedBackground="{StaticResource PrimaryColor}"
+                    <pu:Switch Grid.Row="3" BoxWidth="120"
+    CheckedBackground="{DynamicResource PrimaryColor}"
     CheckedBorderBrush="#36abff"
     ToggleBrush="#030303"
     CheckedForeground="White"
@@ -130,15 +297,15 @@
                                                  Value="True">
                                         <Setter TargetName="text" Property="Text"
                                                 Value="{Binding Converter={StaticResource lc},ConverterParameter='Ts.BtnIsSample'}"/>
-                                        <Setter TargetName="text" Property="Foreground" Value="{StaticResource PrimaryColorContract}"/>
+                                        <Setter TargetName="text" Property="Foreground" Value="{DynamicResource PrimaryColorContract}"/>
                                     </DataTrigger>
                                 </DataTemplate.Triggers>
                             </DataTemplate>
                         </pu:Switch.BoxTemplate>
-                    </pu:Switch>-->
+                    </pu:Switch>
                 </Grid>
-            </GroupBox>
+        </GroupBox> -->
+            </Grid>
         </Grid>
-
     </Grid>
-</hb:PluginControl>
+</hb:PluginMaskControl>

--
Gitblit v1.9.1