957157ae80
## Compilation fixes - Fix XAML namespace reference XplorePlane.Converters → XplorePlane.Helpers (EventLogView, StateDisplayView) - Add missing using for ISampleTypeRepository / JsonSampleTypeRepository in App.xaml.cs - Fix ILoggerService.Warn() calls using Exception as first arg instead of message string - Serialize CncProgram to JSON when passing to MatrixLayout (expects string, not CncProgram object) - Suppress CS8632 nullable annotation warnings project-wide ## BGA wizard fixes - Fix preview not showing on step 3: force RefreshBgaPreview() when entering final step - Add step validation in CanNext() to prevent skipping to preview with invalid inputs - Notify NextCommand.CanExecuteChanged when inputs change - Fix RunProgress runtime binding error: set Mode=OneWay for ProgressBar.Value ## Operator toolbox: prevent duplicate insertion - Add static OperatorTarget property for direct dispatch to active pipeline - PipelineEditorView registers as toolbox target on load (floating window only) - CNC page sets initial target; PipelineEditorWindow resets to CNC pipeline on close - '+' button inserts only to the active pipeline instead of broadcasting to all subscribers ## Pipeline editor status bar messages - Add StatusBarMessageEvent / StatusBarMessagePayload to CommonEvents.cs - PipelineEditorViewModel publishes status on all ops (add/remove/reorder/save/execute) - MainViewModel subscribes and displays on main window bottom status bar - Auto-clear after timeout (3s info, 5s error) ## docs - Merge three architecture docs into consolidated XplorePlane-架构与结构说明.md
162 lines
15 KiB
XML
162 lines
15 KiB
XML
<Window x:Class="XP.Hardware.PLC.Views.PlcAddrConfigEditorWindow"
|
||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
|
||
xmlns:loc="clr-namespace:XP.Common.Localization.Extensions;assembly=XP.Common"
|
||
Title="{loc:Localization PlcAddrEditor_Title}"
|
||
Width="1050" Height="750"
|
||
MinWidth="950" MinHeight="650"
|
||
WindowStartupLocation="CenterScreen"
|
||
Background="#FFF5F5F5">
|
||
|
||
<Grid Margin="10">
|
||
<Grid.RowDefinitions>
|
||
<RowDefinition Height="Auto"/>
|
||
<RowDefinition Height="Auto"/>
|
||
<RowDefinition Height="*"/>
|
||
</Grid.RowDefinitions>
|
||
|
||
<!-- 顶部:文件路径和操作按钮 | Top: File path and action buttons -->
|
||
<Grid Grid.Row="0" Margin="0,0,0,5">
|
||
<Grid.ColumnDefinitions>
|
||
<ColumnDefinition Width="Auto"/>
|
||
<ColumnDefinition Width="*"/>
|
||
<ColumnDefinition Width="Auto"/>
|
||
</Grid.ColumnDefinitions>
|
||
<TextBlock Grid.Column="0" Text="{loc:Localization PlcAddrEditor_FilePath}" VerticalAlignment="Center" Foreground="#FF333333" Margin="0,0,5,0"/>
|
||
<TextBlock Grid.Column="1" Text="{Binding XmlFilePath}" VerticalAlignment="Center" Foreground="#FF666666" TextTrimming="CharacterEllipsis" Margin="0,0,10,0"/>
|
||
<StackPanel Grid.Column="2" Orientation="Horizontal">
|
||
<telerik:RadButton Content="{loc:Localization PlcAddrEditor_Reload}" Command="{Binding ReloadCommand}" Width="70" Margin="0,0,5,0" Height="26" telerik:StyleManager.Theme="Crystal"/>
|
||
<telerik:RadButton Content="{loc:Localization PlcAddrEditor_Save}" Command="{Binding SaveCommand}" Width="70" Margin="0,0,5,0" Height="26" telerik:StyleManager.Theme="Crystal"/>
|
||
<telerik:RadButton Content="{loc:Localization PlcAddrEditor_Cancel}" Command="{Binding CancelCommand}" Width="70" Height="26" telerik:StyleManager.Theme="Crystal"/>
|
||
</StackPanel>
|
||
</Grid>
|
||
|
||
<!-- PLC 连接参数配置(已移除 WriteDbBlock)| PLC Connection Parameters (WriteDbBlock removed) -->
|
||
<GroupBox Grid.Row="1" Header="{loc:Localization PlcAddrEditor_PlcConfigGroup}" Foreground="#FF333333" Margin="0,0,0,5"
|
||
BorderBrush="#FFBDBDBD" Background="#FFFFFFFF">
|
||
<Grid Margin="8">
|
||
<Grid.RowDefinitions>
|
||
<RowDefinition Height="Auto"/>
|
||
<RowDefinition Height="8"/>
|
||
<RowDefinition Height="Auto"/>
|
||
<RowDefinition Height="8"/>
|
||
<RowDefinition Height="Auto"/>
|
||
</Grid.RowDefinitions>
|
||
<Grid.ColumnDefinitions>
|
||
<ColumnDefinition Width="Auto"/>
|
||
<ColumnDefinition Width="*"/>
|
||
<ColumnDefinition Width="20"/>
|
||
<ColumnDefinition Width="Auto"/>
|
||
<ColumnDefinition Width="*"/>
|
||
<ColumnDefinition Width="20"/>
|
||
<ColumnDefinition Width="Auto"/>
|
||
<ColumnDefinition Width="*"/>
|
||
<ColumnDefinition Width="20"/>
|
||
<ColumnDefinition Width="Auto"/>
|
||
<ColumnDefinition Width="*"/>
|
||
<ColumnDefinition Width="20"/>
|
||
<ColumnDefinition Width="Auto"/>
|
||
<ColumnDefinition Width="*"/>
|
||
</Grid.ColumnDefinitions>
|
||
|
||
<!-- Row 1: IP, Port, Rack, Slot, PlcType -->
|
||
<TextBlock Grid.Row="0" Grid.Column="0" Text="IP:" VerticalAlignment="Center" Foreground="#FF333333" Margin="0,0,2,0"/>
|
||
<telerik:RadWatermarkTextBox Grid.Row="0" Grid.Column="1" Text="{Binding IpAddress, UpdateSourceTrigger=PropertyChanged}" Height="26" telerik:StyleManager.Theme="Crystal"/>
|
||
<TextBlock Grid.Row="0" Grid.Column="3" Text="{loc:Localization PlcAddrEditor_Port}" VerticalAlignment="Center" Foreground="#FF333333" Margin="0,0,2,0"/>
|
||
<telerik:RadWatermarkTextBox Grid.Row="0" Grid.Column="4" Text="{Binding Port, UpdateSourceTrigger=PropertyChanged}" Height="26" telerik:StyleManager.Theme="Crystal"/>
|
||
<TextBlock Grid.Row="0" Grid.Column="6" Text="{loc:Localization PlcAddrEditor_Rack}" VerticalAlignment="Center" Foreground="#FF333333" Margin="0,0,2,0"/>
|
||
<telerik:RadWatermarkTextBox Grid.Row="0" Grid.Column="7" Text="{Binding Rack, UpdateSourceTrigger=PropertyChanged}" Height="26" telerik:StyleManager.Theme="Crystal"/>
|
||
<TextBlock Grid.Row="0" Grid.Column="9" Text="{loc:Localization PlcAddrEditor_Slot}" VerticalAlignment="Center" Foreground="#FF333333" Margin="0,0,2,0"/>
|
||
<telerik:RadWatermarkTextBox Grid.Row="0" Grid.Column="10" Text="{Binding Slot, UpdateSourceTrigger=PropertyChanged}" Height="26" telerik:StyleManager.Theme="Crystal"/>
|
||
<TextBlock Grid.Row="0" Grid.Column="12" Text="{loc:Localization PlcAddrEditor_PlcType}" VerticalAlignment="Center" Foreground="#FF333333" Margin="0,0,2,0"/>
|
||
<telerik:RadComboBox Grid.Row="0" Grid.Column="13" ItemsSource="{Binding PlcTypes}" SelectedItem="{Binding SelectedPlcType}" Height="26" telerik:StyleManager.Theme="Crystal"/>
|
||
|
||
<!-- Row 2: ReadDB, ReadStart, ReadLen, BulkReadInterval(已移除 WriteDB)| ReadDB, ReadStart, ReadLen, BulkReadInterval (WriteDB removed) -->
|
||
<TextBlock Grid.Row="2" Grid.Column="0" Text="{loc:Localization PlcAddrEditor_ReadDB}" VerticalAlignment="Center" Foreground="#FF333333" Margin="0,0,2,0"/>
|
||
<telerik:RadWatermarkTextBox Grid.Row="2" Grid.Column="1" Text="{Binding ReadDbBlock, UpdateSourceTrigger=PropertyChanged}" Height="26" telerik:StyleManager.Theme="Crystal"/>
|
||
<TextBlock Grid.Row="2" Grid.Column="3" Text="{loc:Localization PlcAddrEditor_ReadStart}" VerticalAlignment="Center" Foreground="#FF333333" Margin="0,0,2,0"/>
|
||
<telerik:RadWatermarkTextBox Grid.Row="2" Grid.Column="4" Text="{Binding ReadStartAddress, UpdateSourceTrigger=PropertyChanged}" Height="26" telerik:StyleManager.Theme="Crystal"/>
|
||
<TextBlock Grid.Row="2" Grid.Column="6" Text="{loc:Localization PlcAddrEditor_ReadLen}" VerticalAlignment="Center" Foreground="#FF333333" Margin="0,0,2,0"/>
|
||
<telerik:RadWatermarkTextBox Grid.Row="2" Grid.Column="7" Text="{Binding ReadLength, UpdateSourceTrigger=PropertyChanged}" Height="26" telerik:StyleManager.Theme="Crystal"/>
|
||
<TextBlock Grid.Row="2" Grid.Column="9" Text="{loc:Localization PlcAddrEditor_BulkReadInterval}" VerticalAlignment="Center" Foreground="#FF333333" Margin="0,0,2,0"/>
|
||
<telerik:RadWatermarkTextBox Grid.Row="2" Grid.Column="10" Text="{Binding BulkReadIntervalMs, UpdateSourceTrigger=PropertyChanged}" Height="26" telerik:StyleManager.Theme="Crystal"/>
|
||
|
||
<!-- Row 3: ConnTimeout, ReadTimeout, WriteTimeout, Reconnect -->
|
||
<TextBlock Grid.Row="4" Grid.Column="0" Text="{loc:Localization PlcAddrEditor_ConnTimeout}" VerticalAlignment="Center" Foreground="#FF333333" Margin="0,0,2,0"/>
|
||
<telerik:RadWatermarkTextBox Grid.Row="4" Grid.Column="1" Text="{Binding ConnectTimeoutMs, UpdateSourceTrigger=PropertyChanged}" Height="26" telerik:StyleManager.Theme="Crystal"/>
|
||
<TextBlock Grid.Row="4" Grid.Column="3" Text="{loc:Localization PlcAddrEditor_ReadTimeout}" VerticalAlignment="Center" Foreground="#FF333333" Margin="0,0,2,0"/>
|
||
<telerik:RadWatermarkTextBox Grid.Row="4" Grid.Column="4" Text="{Binding ReadTimeoutMs, UpdateSourceTrigger=PropertyChanged}" Height="26" telerik:StyleManager.Theme="Crystal"/>
|
||
<TextBlock Grid.Row="4" Grid.Column="6" Text="{loc:Localization PlcAddrEditor_WriteTimeout}" VerticalAlignment="Center" Foreground="#FF333333" Margin="0,0,2,0"/>
|
||
<telerik:RadWatermarkTextBox Grid.Row="4" Grid.Column="7" Text="{Binding WriteTimeoutMs, UpdateSourceTrigger=PropertyChanged}" Height="26" telerik:StyleManager.Theme="Crystal"/>
|
||
<TextBlock Grid.Row="4" Grid.Column="9" Text="{loc:Localization PlcAddrEditor_Reconnect}" VerticalAlignment="Center" Foreground="#FF333333" Margin="0,0,2,0"/>
|
||
<telerik:RadToggleSwitchButton Grid.Row="4" Grid.Column="10" IsChecked="{Binding BReConnect}" VerticalAlignment="Center" telerik:StyleManager.Theme="Crystal"/>
|
||
</Grid>
|
||
</GroupBox>
|
||
|
||
<!-- 信号地址定义表(动态 Group Tab 页)| Signal Address Definition Tables (Dynamic Group Tabs) -->
|
||
<DockPanel Grid.Row="2">
|
||
<!-- 工具栏:Group 增删 + 分隔 + 信号增删,同一行 | Toolbar: Group add/delete + separator + signal add/delete in one row -->
|
||
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="0,0,0,5">
|
||
<telerik:RadButton Content="{loc:Localization PlcAddrEditor_AddGroup}" Command="{Binding AddGroupCommand}" Width="100" Height="26" Margin="0,0,5,0" telerik:StyleManager.Theme="Crystal"/>
|
||
<telerik:RadButton Content="{loc:Localization PlcAddrEditor_DeleteGroup}" Command="{Binding DeleteGroupCommand}" Width="100" Height="26" Margin="0,0,5,0" telerik:StyleManager.Theme="Crystal"/>
|
||
<telerik:RadButton Content="{loc:Localization PlcAddrEditor_RenameGroup}" Command="{Binding RenameGroupCommand}" Width="110" Height="26" Margin="0,0,5,0" telerik:StyleManager.Theme="Crystal"/>
|
||
<!-- 竖线分隔符 | Vertical separator -->
|
||
<Separator Style="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}" Width="1" Margin="5,2,10,2"/>
|
||
<telerik:RadButton Content="{loc:Localization PlcAddrEditor_AddSignal}" Command="{Binding AddSignalCommand}" Width="100" Height="26" Margin="0,0,5,0" telerik:StyleManager.Theme="Crystal"/>
|
||
<telerik:RadButton Content="{loc:Localization PlcAddrEditor_DeleteSelectedSignal}" Command="{Binding DeleteSignalCommand}" Width="100" Height="26" telerik:StyleManager.Theme="Crystal"/>
|
||
</StackPanel>
|
||
|
||
<!-- 动态 Tab 页,绑定到 Groups 集合 | Dynamic tabs bound to Groups collection -->
|
||
<telerik:RadTabControl ItemsSource="{Binding Groups}"
|
||
SelectedItem="{Binding SelectedGroup}"
|
||
telerik:StyleManager.Theme="Crystal">
|
||
<!-- Tab 标题模板:显示 Group ID | Tab header template: display Group ID -->
|
||
<telerik:RadTabControl.ItemTemplate>
|
||
<DataTemplate>
|
||
<TextBlock Text="{Binding GroupId}"/>
|
||
</DataTemplate>
|
||
</telerik:RadTabControl.ItemTemplate>
|
||
|
||
<!-- Tab 内容模板:DBNumber 编辑 + 信号列表 | Tab content template: DBNumber edit + signal list -->
|
||
<telerik:RadTabControl.ContentTemplate>
|
||
<DataTemplate>
|
||
<DockPanel Margin="5">
|
||
<!-- 顶部:DBNumber 编辑字段 | Top: DBNumber edit field -->
|
||
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="0,0,0,5">
|
||
<TextBlock Text="{loc:Localization PlcAddrEditor_DbNumber}" VerticalAlignment="Center" Foreground="#FF333333" Margin="0,0,5,0"/>
|
||
<telerik:RadWatermarkTextBox Text="{Binding DBNumber, UpdateSourceTrigger=PropertyChanged}" Width="100" Height="26" telerik:StyleManager.Theme="Crystal"/>
|
||
</StackPanel>
|
||
|
||
<!-- 信号列表 RadGridView | Signal list RadGridView -->
|
||
<telerik:RadGridView x:Name="SignalGrid" ItemsSource="{Binding Signals}" AutoGenerateColumns="False"
|
||
CanUserInsertRows="False" CanUserDeleteRows="False" SelectionMode="Single"
|
||
SelectedItem="{Binding DataContext.SelectedSignal, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay}"
|
||
ShowGroupPanel="False" RowIndicatorVisibility="Collapsed"
|
||
telerik:StyleManager.Theme="Crystal">
|
||
<telerik:RadGridView.Columns>
|
||
<telerik:GridViewDataColumn Header="{loc:Localization PlcAddrEditor_ColName}" DataMemberBinding="{Binding Name, UpdateSourceTrigger=PropertyChanged}" Width="150"/>
|
||
<telerik:GridViewComboBoxColumn Header="{loc:Localization PlcAddrEditor_ColType}" DataMemberBinding="{Binding Type, UpdateSourceTrigger=PropertyChanged}"
|
||
ItemsSourceBinding="{Binding DataContext.SupportedDataTypes, RelativeSource={RelativeSource AncestorType=Window}}" Width="100"/>
|
||
<telerik:GridViewDataColumn Header="{loc:Localization PlcAddrEditor_ColStartAddr}" DataMemberBinding="{Binding StartAddr, UpdateSourceTrigger=PropertyChanged}" Width="100"/>
|
||
<telerik:GridViewDataColumn Header="{loc:Localization PlcAddrEditor_ColLength}" DataMemberBinding="{Binding IndexOrLength, UpdateSourceTrigger=PropertyChanged}" Width="100"
|
||
IsReadOnlyBinding="{Binding IsLengthReadOnly}"/>
|
||
<telerik:GridViewDataColumn Header="{loc:Localization PlcAddrEditor_ColRemark}" DataMemberBinding="{Binding Remark, UpdateSourceTrigger=PropertyChanged}" Width="*"/>
|
||
<telerik:GridViewDataColumn Header="" DataMemberBinding="{Binding ValidationError, Mode=OneWay}" IsReadOnly="True" Width="Auto">
|
||
<telerik:GridViewDataColumn.CellStyle>
|
||
<Style TargetType="telerik:GridViewCell">
|
||
<Setter Property="Foreground" Value="#FFD32F2F"/>
|
||
<Setter Property="FontSize" Value="11"/>
|
||
</Style>
|
||
</telerik:GridViewDataColumn.CellStyle>
|
||
</telerik:GridViewDataColumn>
|
||
</telerik:RadGridView.Columns>
|
||
</telerik:RadGridView>
|
||
</DockPanel>
|
||
</DataTemplate>
|
||
</telerik:RadTabControl.ContentTemplate>
|
||
</telerik:RadTabControl>
|
||
</DockPanel>
|
||
</Grid>
|
||
</Window>
|