Files

194 lines
12 KiB
XML

<UserControl x:Class="XP.Hardware.PLC.Sentry.Views.SignalMonitorView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
xmlns:views="clr-namespace:XP.Hardware.PLC.Sentry.Views"
xmlns:converters="clr-namespace:XP.Hardware.PLC.Sentry.Converters"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<UserControl.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVis"/>
<converters:NullOrEmptyToVisibilityConverter x:Key="NullToCollapsedConverter"/>
<!-- 读取错误时的前景色样式 | Foreground style for read errors -->
<Style x:Key="ReadErrorCellStyle" TargetType="telerik:GridViewCell">
<Style.Triggers>
<DataTrigger Binding="{Binding HasReadError}" Value="True">
<Setter Property="Foreground" Value="#FFD32F2F"/>
<Setter Property="FontWeight" Value="SemiBold"/>
</DataTrigger>
</Style.Triggers>
</Style>
<!-- === 写入控件模板 | Write control templates === -->
<!-- bool 类型:ToggleButton | Bool type: ToggleButton -->
<DataTemplate x:Key="BoolWriteTemplate">
<StackPanel Orientation="Vertical">
<ToggleButton IsChecked="{Binding WriteValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Content="{Binding WriteValue, TargetNullValue=False}"
MinWidth="60" Padding="6,2"
HorizontalAlignment="Stretch"/>
<TextBlock Text="{Binding ValidationError}"
Foreground="#FFD32F2F" FontSize="10"
Visibility="{Binding ValidationError, Converter={StaticResource NullToCollapsedConverter}}"
TextWrapping="Wrap" Margin="0,2,0,0"/>
</StackPanel>
</DataTemplate>
<!-- 整数类型:RadNumericUpDown(整数模式)| Integer type: RadNumericUpDown (integer mode) -->
<DataTemplate x:Key="IntegerWriteTemplate">
<StackPanel Orientation="Vertical">
<telerik:RadNumericUpDown Value="{Binding WriteValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
telerik:StyleManager.Theme="Crystal"
NumberDecimalDigits="0"
IsInteger="True"
MinWidth="80"
HorizontalAlignment="Stretch"
UpdateValueEvent="PropertyChanged"/>
<TextBlock Text="{Binding ValidationError}"
Foreground="#FFD32F2F" FontSize="10"
Visibility="{Binding ValidationError, Converter={StaticResource NullToCollapsedConverter}}"
TextWrapping="Wrap" Margin="0,2,0,0"/>
</StackPanel>
</DataTemplate>
<!-- 浮点类型:RadNumericUpDown(浮点模式)| Float type: RadNumericUpDown (float mode) -->
<DataTemplate x:Key="FloatWriteTemplate">
<StackPanel Orientation="Vertical">
<telerik:RadNumericUpDown Value="{Binding WriteValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
telerik:StyleManager.Theme="Crystal"
NumberDecimalDigits="4"
IsInteger="False"
MinWidth="80"
HorizontalAlignment="Stretch"
UpdateValueEvent="PropertyChanged"/>
<TextBlock Text="{Binding ValidationError}"
Foreground="#FFD32F2F" FontSize="10"
Visibility="{Binding ValidationError, Converter={StaticResource NullToCollapsedConverter}}"
TextWrapping="Wrap" Margin="0,2,0,0"/>
</StackPanel>
</DataTemplate>
<!-- 字符串类型:TextBox | String type: TextBox -->
<DataTemplate x:Key="StringWriteTemplate">
<StackPanel Orientation="Vertical">
<TextBox Text="{Binding WriteValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
MinWidth="80"
HorizontalAlignment="Stretch"
Padding="2"/>
<TextBlock Text="{Binding ValidationError}"
Foreground="#FFD32F2F" FontSize="10"
Visibility="{Binding ValidationError, Converter={StaticResource NullToCollapsedConverter}}"
TextWrapping="Wrap" Margin="0,2,0,0"/>
</StackPanel>
</DataTemplate>
<!-- 写入值模板选择器 | Write value template selector -->
<views:WriteValueTemplateSelector x:Key="WriteValueTemplateSelector"
BoolTemplate="{StaticResource BoolWriteTemplate}"
IntegerTemplate="{StaticResource IntegerWriteTemplate}"
FloatTemplate="{StaticResource FloatWriteTemplate}"
StringTemplate="{StaticResource StringWriteTemplate}"/>
</UserControl.Resources>
<Grid>
<!-- 无数据时的占位提示 | Placeholder when no data -->
<TextBlock Text="请加载信号定义文件 | Please load signal definition file"
HorizontalAlignment="Center" VerticalAlignment="Center"
Foreground="#FF999999" FontSize="14"
Visibility="{Binding HasNoGroups, Converter={StaticResource BoolToVis}}"/>
<!-- 信号分组标签页 | Signal group tabs -->
<telerik:RadTabControl ItemsSource="{Binding SignalGroups}"
telerik:StyleManager.Theme="Crystal"
DisplayMemberPath="TabHeader"
OverflowMode="Scroll"
TabStripPlacement="Top">
<telerik:RadTabControl.ContentTemplate>
<DataTemplate>
<!-- 每个 Tab 页内的信号表格 | Signal grid within each tab -->
<telerik:RadGridView ItemsSource="{Binding Signals}"
telerik:StyleManager.Theme="Crystal"
AutoGenerateColumns="False"
IsReadOnly="False"
RowIndicatorVisibility="Collapsed"
ShowGroupPanel="False"
CanUserFreezeColumns="False"
CanUserReorderColumns="True"
CanUserSortColumns="True"
CanUserResizeColumns="True"
ColumnWidth="*"
SelectionMode="Single"
IsFilteringAllowed="False"
ShowColumnSortIndexes="False">
<telerik:RadGridView.Columns>
<!-- 名称列 | Name column -->
<telerik:GridViewDataColumn Header="名称 | Name"
DataMemberBinding="{Binding Name}"
IsReadOnly="True"
Width="200"/>
<!-- 类型列 | Type column -->
<telerik:GridViewDataColumn Header="类型 | Type"
DataMemberBinding="{Binding Type}"
IsReadOnly="True"
Width="80"/>
<!-- 地址列 | Address column -->
<telerik:GridViewDataColumn Header="地址 | Address"
DataMemberBinding="{Binding AddressDisplay}"
IsReadOnly="True"
Width="120"/>
<!-- 当前值列 | Current value column -->
<telerik:GridViewDataColumn Header="当前值 | Value"
DataMemberBinding="{Binding CurrentValue}"
IsReadOnly="True"
Width="120"
CellStyle="{StaticResource ReadErrorCellStyle}"/>
<!-- 写入值列(根据类型动态选择控件)| Write value column (dynamic control by type) -->
<telerik:GridViewColumn Header="写入值 | Write" Width="140">
<telerik:GridViewColumn.CellTemplate>
<DataTemplate>
<ContentControl Content="{Binding}"
ContentTemplateSelector="{StaticResource WriteValueTemplateSelector}"/>
</DataTemplate>
</telerik:GridViewColumn.CellTemplate>
</telerik:GridViewColumn>
<!-- 操作按钮列 | Action button column -->
<telerik:GridViewColumn Header="操作 | Action" Width="140">
<telerik:GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<telerik:RadButton Content="应用" Command="{Binding ApplyCommand}"
telerik:StyleManager.Theme="Crystal"
Width="50" Margin="0,0,4,0" Padding="4,2"
ToolTip="队列写入 | Queue Write"/>
<telerik:RadButton Content="直写" Command="{Binding DirectWriteCommand}"
telerik:StyleManager.Theme="Crystal"
Width="50" Padding="4,2"
ToolTip="直接写入+回读校验 | Direct Write with Verify"/>
</StackPanel>
</DataTemplate>
</telerik:GridViewColumn.CellTemplate>
</telerik:GridViewColumn>
<!-- 备注列 | Remark column -->
<telerik:GridViewDataColumn Header="备注 | Remark"
DataMemberBinding="{Binding Remark}"
IsReadOnly="True"
Width="*"/>
</telerik:RadGridView.Columns>
</telerik:RadGridView>
</DataTemplate>
</telerik:RadTabControl.ContentTemplate>
</telerik:RadTabControl>
</Grid>
</UserControl>