Files
XplorePlane/XP.Hardware.PLC/Views/PlcAddrConfigEditorWindow.xaml
T

162 lines
15 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<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>