194 lines
12 KiB
XML
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>
|