From b544d5cccd76735e034c8055918a50927b437474 Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期二, 10 十一月 2026 08:29:04 +0800
Subject: [PATCH] fix: 维护模式重复进入失败与按钮灰死 + Broker 并发验证用例

---
 HMI.ParameterManage/ParameterManage.xaml |  179 +++++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 129 insertions(+), 50 deletions(-)

diff --git a/HMI.ParameterManage/ParameterManage.xaml b/HMI.ParameterManage/ParameterManage.xaml
index bad6c5f..bdf5ca9 100644
--- a/HMI.ParameterManage/ParameterManage.xaml
+++ b/HMI.ParameterManage/ParameterManage.xaml
@@ -13,33 +13,45 @@
              mc:Ignorable="d" 
              Padding="10"
              Loaded="UserControl_Loaded"
-             Background="{StaticResource WorkspaceBackground}"
+             Background="{DynamicResource WorkspaceBackground}"
              d:DesignHeight="450" d:DesignWidth="800">
+    <UserControl.Resources>
+        <CollectionViewSource x:Key="GroupFilter" Source="{Binding Parameters}">
+            <CollectionViewSource.GroupDescriptions>
+                <PropertyGroupDescription PropertyName="ShowGroup" />
+            </CollectionViewSource.GroupDescriptions>
+        </CollectionViewSource>
+    </UserControl.Resources>
     <Grid>
         <Grid.ColumnDefinitions>
-            <ColumnDefinition Width="2*"/>
-            <ColumnDefinition Width="8*"/>
+            <ColumnDefinition Width="3*"/>
+            <ColumnDefinition Width="7*"/>
         </Grid.ColumnDefinitions>
         <Border Style="{StaticResource CardBoarder}" Margin="0,0,2,0">
-            <StackPanel>
-                <DockPanel Margin="0,0,0,10" Cursor="">
-                    <Button DockPanel.Dock="Right" x:Name="delBatchBtn" pu:ButtonHelper.Icon="&#xe60f;" Style="{StaticResource DangerButton}">鍒犻櫎</Button>
-                    <Button DockPanel.Dock="Right" Style="{StaticResource PrimaryButton}" 
-                        pu:ButtonHelper.Icon="&#xe631;" Margin="0,0,10,0" x:Name="refreshBtn" Click="Button_Click">鍒锋柊</Button>
-                    <Button DockPanel.Dock="Right" Style="{StaticResource PrimaryButton}"
-                        pu:ButtonHelper.Icon="&#xe61a;" Margin="0,0,10,0" x:Name="addBtn" Click="Button_Click">鏂板</Button>
+            <Grid dp:GridHelper.Space="10">
+                <Grid.RowDefinitions>
+                    <RowDefinition Height="Auto"/>
+                    <RowDefinition />
+                </Grid.RowDefinitions>
+                <DockPanel>
+                    <StackPanel DockPanel.Dock="Right" Style="{StaticResource ButtonGroup}">
+                        <Button Style="{StaticResource AddBtn}" x:Name="addBtn" Click="Button_Click"/>
+                        <Button Style="{StaticResource RfhBtn}" x:Name="refreshBtn" Click="Button_Click"/>
+                        <Button Style="{StaticResource DelBtn}" x:Name="delBatchBtn" Click="Button_Click"/>
+                    </StackPanel>
                     <TextBlock DockPanel.Dock="Left" FontSize="{StaticResource TitleFontSize}" 
-                       VerticalAlignment="Center" HorizontalAlignment="Left" Text="浜у搧鍒楄〃"/>
+VerticalAlignment="Center" HorizontalAlignment="Left" Text="{DynamicResource Pm.Product.Title}"/>
                 </DockPanel>
 
-                <DataGrid Grid.Column="1" x:Name="table" Style="{StaticResource DefaultDataGrid}" 
+
+                <DataGrid Grid.Row="1" x:Name="productTable" Style="{StaticResource DefaultDataGrid}" 
                       SelectedItem="{Binding SelectedProduct}" ItemsSource="{Binding Products}">
                     <DataGrid.Columns>
                         <DataGridTemplateColumn Width="Auto" CanUserResize="False">
                             <DataGridTemplateColumn.CellTemplate>
                                 <DataTemplate>
                                     <CheckBox VerticalAlignment="Center"
-                      IsChecked="{Binding Selected,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
+                      IsChecked="{Binding IsSelected,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
                                 </DataTemplate>
                             </DataGridTemplateColumn.CellTemplate>
                         </DataGridTemplateColumn>
@@ -51,76 +63,143 @@
                                 </DataTemplate>
                             </DataGridTemplateColumn.CellTemplate>
                         </DataGridTemplateColumn>
-                        <DataGridTextColumn Width="*" Binding="{Binding Name}" Header="浜у搧鍚嶇О" />
-                        <DataGridTemplateColumn Header="鎿嶄綔" Width="100" IsReadOnly="True" CanUserResize="False">
+                        <DataGridTextColumn Width="*" Binding="{Binding Name}">
+                            <DataGridTextColumn.Header>
+                                <TextBlock Text="{DynamicResource Pm.Product.Name}"/>
+                            </DataGridTextColumn.Header>
+                        </DataGridTextColumn>
+                        <DataGridTemplateColumn Width="100" IsReadOnly="True" CanUserResize="False">
+                            <DataGridTemplateColumn.Header>
+                                <TextBlock Text="{DynamicResource App.Opt}"/>
+                            </DataGridTemplateColumn.Header>
+
                             <DataGridTemplateColumn.CellTemplate>
                                 <DataTemplate>
                                     <StackPanel Orientation="Horizontal" dp:StackPanelHelper.ChildSpace="10">
-                                        <Button x:Name="editProductBtn" Style="{StaticResource RowLink}"  DataContext="{Binding }"
-                    Click="Button_Click">缂栬緫</Button>
-                                        <Button x:Name="delProductBtn" Style="{StaticResource DangerLinkButton}"
+                                        <Button x:Name="editProductBtn" Style="{StaticResource EditLink}"  DataContext="{Binding }"
+                    Click="Button_Click"/>
+                                        <Button x:Name="delProductBtn" Style="{StaticResource DeleteLink}"
                     DataContext="{Binding }"
-                    Click="Button_Click">鍒犻櫎</Button>
+                    Click="Button_Click"/>
                                     </StackPanel>
                                 </DataTemplate>
                             </DataGridTemplateColumn.CellTemplate>
                         </DataGridTemplateColumn>
                     </DataGrid.Columns>
                 </DataGrid>
-            </StackPanel>
+            </Grid>
         </Border>
 
         <Border Grid.Column="1" Style="{StaticResource CardBoarder}" Margin="2,0,0,0">
-            <StackPanel>
-                <DockPanel Margin="0,0,0,10" >
-                    <Button DockPanel.Dock="Right" pu:ButtonHelper.Icon="&#xe60f;" Style="{StaticResource DangerButton}">鍒犻櫎</Button>
-                    <Button DockPanel.Dock="Right" Style="{StaticResource PrimaryButton}" 
-    pu:ButtonHelper.Icon="&#xe631;" Margin="0,0,10,0" x:Name="refreshParameterBtn" Click="Button_Click">鍒锋柊</Button>
-                    <Button DockPanel.Dock="Right" Style="{StaticResource PrimaryButton}"
-    pu:ButtonHelper.Icon="&#xe61a;" Margin="0,0,10,0" x:Name="addParameterBtn" Click="Button_Click">鏂板</Button>
+            <Grid dp:GridHelper.Space="10">
+                <Grid.RowDefinitions>
+                    <RowDefinition Height="Auto"/>
+                    <RowDefinition />
+                </Grid.RowDefinitions>
+                <DockPanel>
+                    <StackPanel DockPanel.Dock="Right" Style="{StaticResource ButtonGroup}">
+                        <Button Style="{StaticResource AddBtn}" x:Name="addParameterBtn" Click="Button_Click"/>
+                        <Button Style="{StaticResource RfhBtn}" x:Name="refreshParameterBtn" Click="Button_Click"/>
+                        <Button Style="{StaticResource DelBtn}" x:Name="deleteBatchParameterBtn" Click="Button_Click"/>
+                    </StackPanel>
                     <TextBlock DockPanel.Dock="Left" FontSize="{StaticResource TitleFontSize}" 
-   VerticalAlignment="Center" HorizontalAlignment="Left" Text="浜у搧鍒楄〃"/>
-                    <TextBlock DockPanel.Dock="Left" FontSize="{StaticResource TitleFontSize}" 
-                       VerticalAlignment="Center" HorizontalAlignment="Left" Text="浜у搧鍙傛暟"/>
+VerticalAlignment="Center" HorizontalAlignment="Left" Text="{DynamicResource Pm.Parameter.Title}"/>
                 </DockPanel>
 
-                <DataGrid x:Name="roleTable" Style="{StaticResource DefaultDataGrid}" SelectionMode="Single" 
-                      ItemsSource="{Binding Parameters}">
+
+                <DataGrid Grid.Row="1" x:Name="parameterTable" Style="{StaticResource DefaultDataGrid}" 
+                          SelectionMode="Single" 
+                          ItemsSource="{Binding Source={StaticResource GroupFilter}}"
+                          SelectedItem="{Binding SelectedParameter}">
+                    <DataGrid.GroupStyle>
+                        <GroupStyle>
+                            <GroupStyle.ContainerStyle>
+                                <Style TargetType="{x:Type GroupItem}">
+                                    <Setter Property="Template">
+                                        <Setter.Value>
+                                            <ControlTemplate TargetType="{x:Type GroupItem}">
+                                                <Expander BorderThickness="0" Background="DarkCyan"
+                                      IsExpanded="True">
+                                                    <Expander.Header>
+                                                        <TextBlock Text="{Binding Name}" FontSize="15"
+                                               Margin="8"
+                                               Foreground="#FFF"/>
+                                                    </Expander.Header>
+                                                    <Border Background="#FFF">
+                                                        <ItemsPresenter />
+                                                    </Border>
+                                                </Expander>
+                                            </ControlTemplate>
+                                        </Setter.Value>
+                                    </Setter>
+                                </Style>
+                            </GroupStyle.ContainerStyle>
+                        </GroupStyle>
+                    </DataGrid.GroupStyle>
+
                     <DataGrid.Columns>
-                        <DataGridTemplateColumn Header="" Width="Auto" CanUserResize="False">
+                        <DataGridTemplateColumn Width="Auto" CanUserResize="False">
                             <DataGridTemplateColumn.CellTemplate>
                                 <DataTemplate>
                                     <CheckBox VerticalAlignment="Center" 
-                HorizontalAlignment="Center" IsChecked="{Binding Selected,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
+          HorizontalAlignment="Center" IsChecked="{Binding IsSelected,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
                                 </DataTemplate>
                             </DataGridTemplateColumn.CellTemplate>
                         </DataGridTemplateColumn>
 
-                        <DataGridTextColumn Header="#" Binding="{Binding Converter={StaticResource rowNumber},
-      RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGridRow},AncestorLevel=1}}"
-              CanUserResize="False"/>
-                        <DataGridTextColumn Width="*" Binding="{Binding Name}" Header="鍚嶇О" />
-                        <DataGridTextColumn Width="*" Binding="{Binding Value}" Header="鍊�" />
-                        <DataGridTextColumn Width="*" Binding="{Binding Unit}" Header="鍗曚綅" />
-                        <DataGridTextColumn Width="*" Binding="{Binding Description}" Header="鎻忚堪" />
-                        <DataGridTextColumn Width="*" Binding="{Binding PGroup}" Header="鍒嗙粍" />
-                        <DataGridTemplateColumn Header="鎿嶄綔" Width="100" IsReadOnly="True" CanUserResize="False">
+                        <DataGridTextColumn Header="#" Width="40" Binding="{Binding Converter={StaticResource rowNumber},
+RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGridRow},AncestorLevel=1}}"
+        CanUserResize="False"/>
+                        <DataGridTextColumn Width="150" Binding="{Binding Name}">
+                            <DataGridTextColumn.Header>
+                                <TextBlock Text="{DynamicResource Pm.Parameter.Name}"/>
+                            </DataGridTextColumn.Header>
+                        </DataGridTextColumn>
+                        <DataGridTextColumn Width="60" Binding="{Binding Type}">
+                            <DataGridTextColumn.Header>
+                                <TextBlock Text="{DynamicResource Pm.Parameter.Type}"/>
+                            </DataGridTextColumn.Header>
+                        </DataGridTextColumn>
+                        <DataGridTextColumn Width="*" Binding="{Binding Value}">
+                            <DataGridTextColumn.Header>
+                                <TextBlock Text="{DynamicResource Pm.Parameter.Value}"/>
+                            </DataGridTextColumn.Header>
+                        </DataGridTextColumn>
+                        <DataGridTextColumn Width="80" Binding="{Binding Unit}">
+                            <DataGridTextColumn.Header>
+                                <TextBlock Text="{DynamicResource Pm.Parameter.Unit}"/>
+                            </DataGridTextColumn.Header>
+                        </DataGridTextColumn>
+                        <DataGridTextColumn Width="*" Binding="{Binding Description}">
+                            <DataGridTextColumn.Header>
+                                <TextBlock Text="{DynamicResource Pm.Parameter.Desc}"/>
+                            </DataGridTextColumn.Header>
+                        </DataGridTextColumn>
+                        <DataGridTextColumn Width="120" Binding="{Binding PGroup}">
+                            <DataGridTextColumn.Header>
+                                <TextBlock Text="{DynamicResource Pm.Parameter.Group}"/>
+                            </DataGridTextColumn.Header>
+                        </DataGridTextColumn>
+                        <DataGridTemplateColumn Width="100" IsReadOnly="True" CanUserResize="False">
+                            <DataGridTemplateColumn.Header>
+                                <TextBlock Text="{DynamicResource App.Opt}"/>
+                            </DataGridTemplateColumn.Header>
                             <DataGridTemplateColumn.CellTemplate>
                                 <DataTemplate>
                                     <StackPanel Orientation="Horizontal">
-                                        <Button x:Name="editParameterBtn" Style="{StaticResource RowLink}" Margin="0,0,10,0"
-                DataContext="{Binding }"
-                Click="Button_Click">缂栬緫</Button>
-                                        <Button x:Name="delParameterBtn" Style="{StaticResource DangerLinkButton}"
-                DataContext="{Binding }"
-                Click="Button_Click">鍒犻櫎</Button>
+                                        <Button x:Name="editParameterBtn" Style="{StaticResource EditLink}" Margin="0,0,10,0"
+          DataContext="{Binding }"
+          Click="Button_Click"/>
+                                        <Button x:Name="delParameterBtn" Style="{StaticResource DeleteLink}"
+          DataContext="{Binding }"
+          Click="Button_Click"/>
                                     </StackPanel>
                                 </DataTemplate>
                             </DataGridTemplateColumn.CellTemplate>
                         </DataGridTemplateColumn>
                     </DataGrid.Columns>
                 </DataGrid>
-            </StackPanel>
+            </Grid>
         </Border>
     </Grid>
 </hb:PluginControl>
\ No newline at end of file

--
Gitblit v1.9.1