Pārlūkot izejas kodu

新增数据监控页面

djs 4 mēneši atpakaļ
vecāks
revīzija
11dcb52771

+ 7 - 0
MV485/MV485.csproj

@@ -107,6 +107,9 @@
     <Compile Include="uc\UCDeviceConfig.xaml.cs">
       <DependentUpon>UCDeviceConfig.xaml</DependentUpon>
     </Compile>
+    <Compile Include="uc\UCMonitorData2.xaml.cs">
+      <DependentUpon>UCMonitorData2.xaml</DependentUpon>
+    </Compile>
     <Compile Include="uc\UCRunConfig.xaml.cs">
       <DependentUpon>UCRunConfig.xaml</DependentUpon>
     </Compile>
@@ -157,6 +160,10 @@
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
+    <Page Include="uc\UCMonitorData2.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
     <Page Include="uc\UCRunConfig.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>

+ 1 - 1
MV485/MainWindow.xaml.cs

@@ -51,7 +51,7 @@ namespace MV485
             }
             else
             {
-                var page = new UCMonitorData();
+                var page = new UCMonitorData2();
                 //pageCache[key] = page;  //缓存页面
                 ContentArea.Content = page;
             }

+ 89 - 14
MV485/helper/RWRunConfig.cs

@@ -203,20 +203,95 @@ namespace MV485.helper
             string writeName = "";
             try
             {
-                writeName = "水表类型";
-                _modbusMaster.WriteSingleRegister(devId, Constant.MB_REGISTER_ADD_METER_TYPE, runConfig.MeterType);
-                GenerateValueLog(writeName, runConfig.LatestValue);
-                GenerateSendAndRecvHexLog(writeName);
-
-                writeName = "每小时最大水流";
-                _modbusMaster.WriteSingleRegister(devId, Constant.MB_REGISTER_ADD_DN_VALUE, runConfig.DnValue);
-                GenerateValueLog(writeName, runConfig.DnValue);
-                GenerateSendAndRecvHexLog(writeName);
-
-                writeName = "表底读数";
-                _modbusMaster.WriteMultipleRegisters(devId, Constant.MB_REGISTER_ADD_LATEST_VALUE, runConfig.LatestValues);
-                GenerateValueLog(writeName, runConfig.LatestValue);
-                GenerateSendAndRecvHexLog(writeName);                
+                if (runConfig.MeterTypeWriteFlag)
+                {
+                    writeName = "水表类型";
+                    _modbusMaster.WriteSingleRegister(devId, Constant.MB_REGISTER_ADD_METER_TYPE, runConfig.MeterType);
+                    GenerateValueLog(writeName, runConfig.LatestValue);
+                    GenerateSendAndRecvHexLog(writeName);
+                }
+
+
+                if (runConfig.DnValueWriteFlag)
+                {
+                    writeName = "每小时最大水流";
+                    _modbusMaster.WriteSingleRegister(devId, Constant.MB_REGISTER_ADD_DN_VALUE, runConfig.DnValue);
+                    GenerateValueLog(writeName, runConfig.DnValue);
+                    GenerateSendAndRecvHexLog(writeName);
+                }
+
+                if (runConfig.DigitCountWriteFlag)
+                {
+                    writeName = "数字个数";
+                    _modbusMaster.WriteSingleRegister(devId, Constant.MB_REGISTER_ADD_DIGIT_COUNT, runConfig.DigitCount);
+                    GenerateValueLog(writeName, runConfig.DigitCount);
+                    GenerateSendAndRecvHexLog(writeName);
+                }
+
+                if (runConfig.IndCountWriteFlag)
+                {
+                    writeName = "指针个数";
+                    _modbusMaster.WriteSingleRegister(devId, Constant.MB_REGISTER_ADD_INDICATOR_COUNT, runConfig.IndCount);
+                    GenerateValueLog(writeName, runConfig.IndCount);
+                    GenerateSendAndRecvHexLog(writeName);
+                }
+
+                if (runConfig.BrightValueWriteFlag)
+                {
+                    writeName = "照片亮度系数";
+                    ushort brightValue = (ushort)(runConfig.BrightValue * 10);
+                    _modbusMaster.WriteSingleRegister(devId, Constant.MB_REGISTER_ADD_BRIGHT_VALUE, brightValue);
+                    GenerateValueLog(writeName, runConfig.BrightValue);
+                    GenerateSendAndRecvHexLog(writeName);
+                }
+
+                if (runConfig.LastUnitLevelWriteFlag)
+                {
+                    writeName = "尾数单位等级";
+                    _modbusMaster.WriteSingleRegister(devId, Constant.MB_REGISTER_ADD_LAST_UNIT_LEVEL, runConfig.LastUnitLevel);
+                    GenerateValueLog(writeName, runConfig.LastUnitLevel);
+                    GenerateSendAndRecvHexLog(writeName);
+                }
+
+                if (runConfig.LatestValueWriteFlag)
+                {
+                    writeName = "表底读数";
+                    _modbusMaster.WriteMultipleRegisters(devId, Constant.MB_REGISTER_ADD_LATEST_VALUE, runConfig.LatestValues);
+                    GenerateValueLog(writeName, runConfig.LatestValue);
+                    GenerateSendAndRecvHexLog(writeName);
+                }
+
+                if (runConfig.LatestTImeWriteFlag && runConfig.LatestTimes != null)
+                {
+                    writeName = "表底读数时间";
+                    _modbusMaster.WriteMultipleRegisters(devId, Constant.MB_REGISTER_ADD_LATEST_TIME, runConfig.LatestTimes);
+                    GenerateValueLog(writeName, runConfig.LatestTime.ToString("yyyy-MM-dd HH:mm:ss"));
+                    GenerateSendAndRecvHexLog(writeName);
+                }
+
+                if (runConfig.MeterRegionWriteFlag && runConfig.MeterRegions != null)
+                {
+                    writeName = "表盘区域坐标";
+                    _modbusMaster.WriteMultipleRegisters(devId, Constant.MB_REGISTER_ADD_METER_REGION, runConfig.MeterRegions);
+                    GenerateValueLog(writeName, runConfig.MeterRegion);
+                    GenerateSendAndRecvHexLog(writeName);
+                }
+
+                if (runConfig.DigitRegionWriteFlag && runConfig.DigitRegions != null)
+                {
+                    writeName = "数字区域坐标";
+                    _modbusMaster.WriteMultipleRegisters(devId, Constant.MB_REGISTER_ADD_DIGIT_REGION, runConfig.DigitRegions);
+                    GenerateValueLog(writeName, runConfig.DigitRegion);
+                    GenerateSendAndRecvHexLog(writeName);
+                }
+
+                if (runConfig.FTIndRegionWriteFlag && runConfig.FTIndRegions != null)
+                {
+                    writeName = "指针水表首尾同刻度坐标";
+                    _modbusMaster.WriteMultipleRegisters(devId, Constant.MB_REGISTER_ADD_FTIND_REGION, runConfig.FTIndRegions);
+                    GenerateValueLog(writeName, runConfig.FTIndRegion);
+                    GenerateSendAndRecvHexLog(writeName);
+                }
             }
             catch (TimeoutException ex)
             {

+ 103 - 1
MV485/model/RunConfig.cs

@@ -9,18 +9,37 @@ namespace MV485.model
     public class RunConfig
     {
         public byte MeterType { get; set; }
+        public bool MeterTypeWriteFlag { get; set; }
+
         public ushort DnValue { get; set; }
+        public bool DnValueWriteFlag { get; set; }
+
         public byte DigitCount { get; set; }
+        public bool DigitCountWriteFlag { get; set; }
+
         public byte IndCount { get; set; }
+        public bool IndCountWriteFlag { get; set; }
+
         public float BrightValue { get; set; }
+        public bool BrightValueWriteFlag { get; set; }
+
         public byte LastUnitLevel { get; set; }
+        public bool LastUnitLevelWriteFlag { get; set; }
 
         public ulong LatestValue { get; set; }
+        public bool LatestValueWriteFlag { get; set; }
 
         public DateTime LatestTime { get; set; }
+        public bool LatestTImeWriteFlag { get; set; }
+
         public string MeterRegion { get; set; }
+        public bool MeterRegionWriteFlag { get; set; }
+
         public string DigitRegion { get; set; }
-        public string FTIndRegionG { get; set; }
+        public bool DigitRegionWriteFlag { get; set; }
+
+        public string FTIndRegion { get; set; }
+        public bool FTIndRegionWriteFlag { get; set; }
 
 
         // 新增属性:按大端序将 LatestValue 转换为 ushort[4]
@@ -46,6 +65,30 @@ namespace MV485.model
             }
         }
 
+        public ushort[] LatestTimes
+        {
+            get
+            {
+                if (LatestTime != null)
+                {
+                    ushort[] result = new ushort[6];
+                    result[0] = (ushort)(LatestTime.Year - 2000);
+                    result[1] = (ushort)LatestTime.Month;
+                    result[2] = (ushort)LatestTime.Day;
+                    result[3] = (ushort)LatestTime.Hour;
+                    result[4] = (ushort)LatestTime.Minute;
+                    result[5] = (ushort)LatestTime.Second;
+
+                    return result;
+                }
+                else
+                {
+                    return null;
+                }
+
+            }
+        }
+
         /*public ushort[] LatestValues
         {
             get
@@ -96,6 +139,65 @@ namespace MV485.model
             LatestValue = value;
         }
 
+
+        public ushort[] MeterRegions
+        {
+            get
+            {
+                ushort[] result = ConvertStringToUShortArray(MeterRegion, 4);
+
+                return result;
+            }
+        }
+
+        public ushort[] DigitRegions
+        {
+            get
+            {
+                ushort[] result = ConvertStringToUShortArray(DigitRegion, 8);
+                return result;
+            }
+        }
+
+        public ushort[] FTIndRegions
+        {
+            get
+            {
+                ushort[] result = ConvertStringToUShortArray(FTIndRegion, 4);
+                return result;
+            }
+        }
+
+        /// <summary>
+        /// 将字符串按分隔符(逗号、空格)分割并转换为固定长度的 ushort 数组
+        /// </summary>
+        /// <param name="input">输入字符串</param>
+        /// <param name="expectedLength">期望的数组长度</param>
+        /// <returns>ushort数组(失败返回null)</returns>
+        public static ushort[] ConvertStringToUShortArray(string input, int expectedLength)
+        {
+            // 1. 分割字符串(支持逗号和空格分隔)
+            string[] parts = input.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
+
+            // 2. 验证分割后的元素数量
+            if (parts.Length != expectedLength)
+            {
+                return null;
+            }
+
+            // 3. 尝试转换为ushort数组
+            ushort[] array = new ushort[expectedLength];
+            for (int i = 0; i < expectedLength; i++)
+            {
+                if (!ushort.TryParse(parts[i], out array[i]))
+                {
+                    return null; // 转换失败(非数字或超出ushort范围)
+                }
+            }
+
+            return array;
+        }
+
         public RunConfig()
         {
 

+ 403 - 0
MV485/uc/UCMonitorData2.xaml

@@ -0,0 +1,403 @@
+<UserControl x:Class="MV485.uc.UCMonitorData2"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:MV485.uc"
+             xmlns:zdfflatui="clr-namespace:ZdfFlatUI;assembly=WPF.UI"
+             mc:Ignorable="d" 
+             Padding="5,2,5,5"
+             Background="WhiteSmoke"             
+             d:DesignHeight="600" d:DesignWidth="1366">
+    <UserControl.Resources>
+        <!--<BooleanToVisibilityConverter x:Key="BoolToVisibilityConverter" />
+        <local1:InverseBoolToVisibilityConverter x:Key="InverseBoolToVisibilityConverter" />-->
+
+        <Style TargetType="ContextMenu">
+            <Setter Property="Background" Value="White"/>
+            <Setter Property="BorderBrush" Value="#DDDDDD"/>
+            <Setter Property="BorderThickness" Value="1"/>
+        </Style>
+
+        <Style TargetType="MenuItem">
+            <Setter Property="Padding" Value="5,2"/>
+            <!--<Setter Property="Icon" Value="{StaticResource DefaultIcon}"/>-->
+        </Style>
+    </UserControl.Resources>
+    <Grid>
+        <Grid.ColumnDefinitions>
+            <ColumnDefinition Width="550" />
+            <ColumnDefinition Width="*" />
+        </Grid.ColumnDefinitions>
+
+        <Border Grid.Column="0" BorderBrush="#D3D3D3" BorderThickness="0 0 1 0">
+            <Grid>
+                <Grid.RowDefinitions>
+                    <RowDefinition Height="35" />
+                    <RowDefinition Height="*" />
+                    <RowDefinition Height="40" />
+                </Grid.RowDefinitions>
+
+                <Grid Grid.Row="0" Margin="0 5 0 0">
+                    <TextBlock Text="485设备列表" VerticalAlignment="Center" FontSize="14px" FontWeight="Bold" Margin="10 0 0 0" />
+                    <StackPanel Orientation="Horizontal" Grid.Row="0" HorizontalAlignment="Right" Margin="0 0 10 0">
+                        <!--<StackPanel x:Name="pnlDetailFunc" Orientation="Horizontal" HorizontalAlignment="Right">-->
+                            <TextBlock Text="端口名称" VerticalAlignment="Center" Margin="0 0 5 0" 
+                                   Foreground="Black" FontSize="14px" FontWeight="Normal"/>
+                            <ComboBox Grid.Column="1" x:Name="cmbComPort" FontSize="13px" Foreground="#000000" 
+                                      DisplayMemberPath="Value" SelectedValuePath="Key" Width="110"                                  
+                                      Margin="0,0,10,0" Padding="4" VerticalAlignment="Center"/>
+
+                            <zdfflatui:FlatButton Grid.Column="0" x:Name="btnAddDevice" HorizontalAlignment="Left"
+                                                  Background="#4CAF50" Content="添加设备"
+                                                    Click="BtnAddDevice_Click" Foreground="White"
+                                                  Width="80" Height="28" FontSize="13" Margin="10 0 0 0" />
+                        <!--<zdfflatui:FlatButton Grid.Column="1" x:Name="btnDelDevice" HorizontalAlignment="Left"
+                                                  Background="#FF4C4C" Content="删除设备"
+                                                    Click="BtnDelDevice_Click" Foreground="White"
+                                                  Width="80" Height="28" FontSize="13" Margin="10 0 0 0" />-->
+                        <!--<zdfflatui:FlatButton Grid.Column="1" x:Name="btnTestConnect" HorizontalAlignment="Left"
+                                                  Background="#2196F3" Content="连接测试"
+                                                    Click="BtnDelDevice_Click" Foreground="White"
+                                                  Width="80" Height="28" FontSize="13" Margin="10 0 0 0" />-->
+                    </StackPanel>
+                </Grid>
+
+
+                <Border Grid.Row="1" BorderThickness="0" Padding="5 5 5 5">
+                    <DataGrid Name="dgDevice" GridLinesVisibility="All" HorizontalGridLinesBrush="#D3D3D3" VerticalGridLinesBrush="#D3D3D3" RowHeight="80" BorderBrush="#D3D3D3"
+                          HeadersVisibility="Column" SelectionMode="Single" SelectionUnit="FullRow" HorizontalScrollBarVisibility="Auto" CanUserResizeColumns="False"  
+                          SelectedItem="{Binding SelectedDeviceItem,Mode=TwoWay}"
+                          AutoGenerateColumns="False" CanUserAddRows="False" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="White">
+                        <DataGrid.Resources>
+                            <Style TargetType="DataGridColumnHeader">
+                                <Setter Property="Height" Value="40" />
+                                <!--Setter Property="Background" Value="White" /-->
+                                <Setter Property="Foreground" Value="Black" />
+                                <Setter Property="FontSize" Value="13px" />
+                                <Setter Property="FontWeight" Value="Bold" />
+                                <Setter Property="BorderBrush" Value="#D3D3D3" />
+                                <Setter Property="BorderThickness" Value="0,0,1,1" />
+                                <Setter Property="HorizontalContentAlignment" Value="Center" />
+                            </Style>
+                            <!-- 自定义行的选中样式 -->
+                            <Style TargetType="DataGridRow">
+                                <Style.Triggers>
+                                    <!-- 当行被选中时 -->
+                                    <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="True">
+                                        <!-- 设置选中行的背景色 -->
+                                        <Setter Property="Background" Value="AliceBlue"/>
+                                    </DataTrigger>
+                                </Style.Triggers>
+                            </Style>
+
+                            <!-- 自定义选中单元格的背景色 -->
+                            <Style TargetType="DataGridCell">
+                                <Style.Triggers>
+                                    <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="True">
+                                        <!-- 设置选中单元格的背景色 -->
+                                        <Setter Property="Background" Value="AliceBlue"/>
+                                        <Setter Property="BorderBrush" Value="Transparent" />
+                                    </DataTrigger>
+                                </Style.Triggers>
+                            </Style>
+                        </DataGrid.Resources>
+
+
+                        <DataGrid.Columns>
+                            <DataGridTemplateColumn Header="串口参数"  Width="100">
+                                <DataGridTemplateColumn.CellTemplate>
+                                    <DataTemplate>
+                                        <TextBlock Text="{Binding ConnectParam}" FontSize="14px" Foreground="Black"  
+                                                   HorizontalAlignment="Left" 
+                                                   VerticalAlignment="Center"
+                                                   Padding="5 0 0 0"/>
+                                    </DataTemplate>
+                                </DataGridTemplateColumn.CellTemplate>
+                            </DataGridTemplateColumn>
+
+                            <DataGridTemplateColumn Header="地址"  Width="50">
+                                <DataGridTemplateColumn.CellTemplate>
+                                    <DataTemplate>
+                                        <TextBlock Text="{Binding DeviceId}" FontSize="14px" Foreground="Black"  
+                                                   HorizontalAlignment="Left" 
+                                                   VerticalAlignment="Center"
+                                                   Padding="5 0 0 0"/>
+                                    </DataTemplate>
+                                </DataGridTemplateColumn.CellTemplate>
+                            </DataGridTemplateColumn>
+
+                            <DataGridTemplateColumn Header="读频率"  Width="60">
+                                <DataGridTemplateColumn.CellTemplate>
+                                    <DataTemplate>
+                                        <TextBlock Text="{Binding ReadFreqName}" FontSize="14px" Foreground="Black"  
+                                                   HorizontalAlignment="Left" 
+                                                   VerticalAlignment="Center"
+                                                   Padding="5 0 0 0"/>
+                                    </DataTemplate>
+                                </DataGridTemplateColumn.CellTemplate>
+                            </DataGridTemplateColumn>
+
+                            <DataGridTemplateColumn Header="启用"  Width="60">
+                                <DataGridTemplateColumn.CellTemplate>
+                                    <DataTemplate>
+                                        <TextBlock Text="{Binding ReadStatusName}" FontSize="14px" Foreground="{Binding ReadStatusColor}"  
+                                                   HorizontalAlignment="Left" 
+                                                   VerticalAlignment="Center"
+                                                   Padding="5 0 0 0"/>
+                                    </DataTemplate>
+                                </DataGridTemplateColumn.CellTemplate>
+                            </DataGridTemplateColumn>
+
+                            <DataGridTemplateColumn Header="读照片"  Width="60">
+                                <DataGridTemplateColumn.CellTemplate>
+                                    <DataTemplate>
+                                        <TextBlock Text="{Binding ReadStatusName}" FontSize="14px" Foreground="{Binding ReadStatusColor}"  
+                                                   HorizontalAlignment="Left" 
+                                                   VerticalAlignment="Center"
+                                                   Padding="5 0 0 0"/>
+                                    </DataTemplate>
+                                </DataGridTemplateColumn.CellTemplate>
+                            </DataGridTemplateColumn>
+
+                            <DataGridTemplateColumn Header="操作" Width="60">
+                                <DataGridTemplateColumn.CellTemplate>
+                                    <DataTemplate>
+                                        <StackPanel Orientation="Vertical" VerticalAlignment="Center">
+                                            <Button x:Name="btnConnectTest" Width="Auto" FontSize="13px" Content="连接测试" Foreground="#2196F3" VerticalAlignment="Center"
+                                                    BorderBrush="Transparent" BorderThickness="0 0 0 0" Background="Transparent" Click="BtnConnectTest_Click"  />
+                                            <Button x:Name="btnUpdateDevice" Width="Auto" FontSize="13px" Content="更新" Foreground="#2196F3" VerticalAlignment="Center"
+                                                    Click="BtnUpdateDevice_Click"
+                                                    BorderBrush="Transparent" BorderThickness="0 0 0 0" Background="Transparent" Margin="0 0 0 10" />
+                                            <Button x:Name="btnDelDevice" Width="Auto" FontSize="13px" Content="删除" Foreground="#2196F3" VerticalAlignment="Center"
+                                                    BorderBrush="Transparent" BorderThickness="0 0 0 0" Background="Transparent" Click="BtnDelDevice_Click"  />
+                                        </StackPanel>
+                                    </DataTemplate>
+                                </DataGridTemplateColumn.CellTemplate>
+                            </DataGridTemplateColumn>
+
+                            <DataGridTemplateColumn Header="最后读时间"  Width="120">
+                                <DataGridTemplateColumn.CellTemplate>
+                                    <DataTemplate>
+                                        <TextBlock Text="{Binding ReadFreqName}" FontSize="14px" Foreground="Black"  
+                                                       HorizontalAlignment="Left" 
+                                                       VerticalAlignment="Center"
+                                                       Padding="5 0 0 0"/>
+                                    </DataTemplate>
+                                </DataGridTemplateColumn.CellTemplate>
+                            </DataGridTemplateColumn>
+                            <!--<DataGridTemplateColumn Header="标注" Width="50">
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBlock Text="{Binding MarkCountName}" FontSize="13px" Foreground="#000000" HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>-->
+
+                        </DataGrid.Columns>
+
+                    </DataGrid>
+                </Border>
+
+                <StackPanel Grid.Row="2" Height="35" Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0 0 0 0">
+                    <TextBlock Text="{Binding Path=TotalRecords,StringFormat='共 {0} 个设备'}" Margin="5" VerticalAlignment="Center" FontSize="13px"/>
+                </StackPanel>
+
+            </Grid>
+        </Border>
+
+        <Border Grid.Column="1" BorderBrush="#D3D3D3" BorderThickness="0 0 0 0">
+            <Grid>
+                <Grid.RowDefinitions>
+                    <RowDefinition Height="35" />
+                    <RowDefinition Height="*" />
+                    <RowDefinition Height="40" />
+                </Grid.RowDefinitions>
+
+                <Grid Grid.Row="0" Margin="0 5 0 0">
+                    <StackPanel Orientation="Horizontal" Grid.Row="0">
+                        <TextBlock Text="COM1-115200 设备地址:123(0x01)" FontSize="14px" FontWeight="Bold"
+                               Foreground="Black" VerticalAlignment="Center" Margin="10 0 0 0" />
+                    </StackPanel>
+                    <zdfflatui:FlatButton Grid.Column="1" x:Name="btnClearData" HorizontalAlignment="Right"
+                                                  Background="#FF4C4C" Content="清空数据"
+                                                    Click="BtnClearData_Click" Foreground="White"
+                                                  Width="80" Height="28" FontSize="13" Margin="10 0 10 0" />
+                </Grid>
+
+                <Border Grid.Row="1" BorderThickness="0" Padding="5 5 5 5">
+                    <DataGrid Name="dgData" GridLinesVisibility="All" HorizontalGridLinesBrush="#D3D3D3" VerticalGridLinesBrush="#D3D3D3" RowHeight="80" BorderBrush="#D3D3D3"
+                          HeadersVisibility="Column" SelectionMode="Single" SelectionUnit="FullRow" HorizontalScrollBarVisibility="Auto" CanUserResizeColumns="False"  
+                          SelectedItem="{Binding SelectedDeviceItem,Mode=TwoWay}" FrozenColumnCount="2"
+                          AutoGenerateColumns="False" CanUserAddRows="False" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="White">
+                        <DataGrid.Resources>
+                            <Style TargetType="DataGridColumnHeader">
+                                <Setter Property="Height" Value="40" />
+                                <!--Setter Property="Background" Value="White" /-->
+                                <Setter Property="Foreground" Value="Black" />
+                                <Setter Property="FontSize" Value="13px" />
+                                <Setter Property="FontWeight" Value="Bold" />
+                                <Setter Property="BorderBrush" Value="#D3D3D3" />
+                                <Setter Property="BorderThickness" Value="0,0,1,1" />
+                                <Setter Property="HorizontalContentAlignment" Value="Center" />
+                            </Style>
+                            <!-- 自定义行的选中样式 -->
+                            <Style TargetType="DataGridRow">
+                                <Style.Triggers>
+                                    <!-- 当行被选中时 -->
+                                    <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="True">
+                                        <!-- 设置选中行的背景色 -->
+                                        <Setter Property="Background" Value="AliceBlue"/>
+                                    </DataTrigger>
+                                </Style.Triggers>
+                            </Style>
+
+                            <!-- 自定义选中单元格的背景色 -->
+                            <Style TargetType="DataGridCell">
+                                <Style.Triggers>
+                                    <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="True">
+                                        <!-- 设置选中单元格的背景色 -->
+                                        <Setter Property="Background" Value="AliceBlue"/>
+                                        <Setter Property="BorderBrush" Value="Transparent" />
+                                    </DataTrigger>
+                                </Style.Triggers>
+                            </Style>
+                        </DataGrid.Resources>
+
+
+                        <DataGrid.Columns>
+                            <DataGridTemplateColumn Header="设备SN"  Width="120">
+                                <DataGridTemplateColumn.CellTemplate>
+                                    <DataTemplate>
+                                        <TextBlock Text="{Binding DeviceSn}" FontSize="14px" Foreground="Black"  
+                                                   HorizontalAlignment="Left" 
+                                                   VerticalAlignment="Center"
+                                                   Padding="5 0 0 0"/>
+                                    </DataTemplate>
+                                </DataGridTemplateColumn.CellTemplate>
+                            </DataGridTemplateColumn>
+
+                            <DataGridTemplateColumn Header="485读取时间"  Width="120">
+                                <DataGridTemplateColumn.CellTemplate>
+                                    <DataTemplate>
+                                        <TextBlock Text="{Binding ReadTime}" FontSize="14px" Foreground="Black"  
+                                                   HorizontalAlignment="Left" 
+                                                   VerticalAlignment="Center"
+                                                   Padding="5 0 0 0"/>
+                                    </DataTemplate>
+                                </DataGridTemplateColumn.CellTemplate>
+                            </DataGridTemplateColumn>
+
+                            <!--<DataGridTemplateColumn Header="结果图片" Width="120">
+                                <DataGridTemplateColumn.CellTemplate>
+                                    <DataTemplate>
+                                        <Image Visibility="{Binding ResultVisiable}" Source="{Binding DstImage,Converter={StaticResource ImagePatchConverter}}"
+                                   ToolTip="{Binding DstImage}"
+                                   PreviewMouseLeftButtonDown ="DstImage_PreviewMouseLeftButtonDown"
+                                   VerticalAlignment="Center" HorizontalAlignment="Center" Margin="2,2,2,2"/>
+                                    </DataTemplate>
+                                </DataGridTemplateColumn.CellTemplate>
+                            </DataGridTemplateColumn>-->
+
+                            <DataGridTemplateColumn Header="水表照片" Width="120">
+                                <DataGridTemplateColumn.CellTemplate>
+                                    <DataTemplate>
+                                        <Image Source="{Binding MeterImage}" PreviewMouseLeftButtonDown="MeterImage_PreviewMouseLeftButtonDown"
+                                           ToolTip="{Binding MeterImage}"
+                                           VerticalAlignment="Center" HorizontalAlignment="Center"  Margin="2,2,2,2"/>
+                                    </DataTemplate>
+                                </DataGridTemplateColumn.CellTemplate>
+                            </DataGridTemplateColumn>
+
+                            <DataGridTemplateColumn Header="累计流量(m³)"  Width="120">
+                                <DataGridTemplateColumn.CellTemplate>
+                                    <DataTemplate>
+                                        <TextBlock Text="{Binding AiResult}" FontSize="14px" Foreground="Black"  
+                                                   HorizontalAlignment="Left" 
+                                                   VerticalAlignment="Center"
+                                                   Padding="5 0 0 0"/>
+                                    </DataTemplate>
+                                </DataGridTemplateColumn.CellTemplate>
+                            </DataGridTemplateColumn>
+
+                            <DataGridTemplateColumn Header="采样时间"  Width="120">
+                                <DataGridTemplateColumn.CellTemplate>
+                                    <DataTemplate>
+                                        <TextBlock Text="{Binding SampleTime}" FontSize="14px" Foreground="Black"  
+                                                   HorizontalAlignment="Left" 
+                                                   VerticalAlignment="Center"
+                                                   Padding="5 0 0 0"/>
+                                    </DataTemplate>
+                                </DataGridTemplateColumn.CellTemplate>
+                            </DataGridTemplateColumn>
+
+                            <DataGridTemplateColumn Header="水表类型"  Width="100">
+                                <DataGridTemplateColumn.CellTemplate>
+                                    <DataTemplate>
+                                        <TextBlock Text="{Binding MeterTypeName}" FontSize="14px" 
+                                                   HorizontalAlignment="Left" 
+                                                   VerticalAlignment="Center"
+                                                   Padding="5 0 0 0"/>
+                                    </DataTemplate>
+                                </DataGridTemplateColumn.CellTemplate>
+                            </DataGridTemplateColumn>
+
+                            <DataGridTemplateColumn Header="结果说明"  Width="150">
+                                <DataGridTemplateColumn.CellTemplate>
+                                    <DataTemplate>
+                                        <TextBlock Text="{Binding MeterResultName}" FontSize="14px" Foreground="Black"  
+                                                       HorizontalAlignment="Left" 
+                                                       VerticalAlignment="Center"
+                                                       Padding="5 0 0 0"/>
+                                    </DataTemplate>
+                                </DataGridTemplateColumn.CellTemplate>
+                            </DataGridTemplateColumn>
+                            <DataGridTemplateColumn Header="操作" Width="60">
+                                <DataGridTemplateColumn.CellTemplate>
+                                    <DataTemplate>
+                                        <StackPanel Orientation="Vertical" VerticalAlignment="Center">
+                                            <Button x:Name="btnLogViewer" Width="Auto" FontSize="13px" Content="日志" Foreground="#2196F3" VerticalAlignment="Center"
+                                                    Click="BtnLogViewer_Click"
+                                                    BorderBrush="Transparent" BorderThickness="0 0 0 0" Background="Transparent" Margin="0 0 0 10" />
+                                            <Button x:Name="btnDelData" Width="Auto" FontSize="13px" Content="删除" Foreground="#2196F3" VerticalAlignment="Center"
+                                                    BorderBrush="Transparent" BorderThickness="0 0 0 0" Background="Transparent" Click="BtnDelData_Click"  />
+                                        </StackPanel>
+                                    </DataTemplate>
+                                </DataGridTemplateColumn.CellTemplate>
+                            </DataGridTemplateColumn>
+                        </DataGrid.Columns>
+                    </DataGrid>
+                </Border>
+
+                <!-- 底部分页控件 -->
+                <StackPanel Grid.Row="2" Height="35" Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0">
+                    <!--<TextBlock Text="共 100 条数据" Margin="5" VerticalAlignment="Center" FontSize="13px"/>-->
+                    <TextBlock Text="{Binding ElementName=ucPatchGird,Path=TotalRecords,StringFormat='共 {0} 条数据'}" Margin="5" VerticalAlignment="Center" FontSize="13px"/>
+                    <ComboBox Width="55" Margin="5" FontSize="13px" 
+                              ItemsSource="{Binding PageSizeOptions}"
+                              SelectedValue="{Binding mConfigItem.PageSize3}"/>
+                    <Button x:Name="btnDataFirstPage" Content="首页" Width="55" Margin="5" FontSize="13px" Click="BtnDataFirstPage_Click"/>
+                    <Button x:Name="btnDataPrePage" Content="上一页" Width="55" Margin="5" FontSize="13px" Click="BtnDataPrePage_Click"/>
+                    <!--<TextBlock Text="第 2 页 / 共 10 页" Margin="5" FontSize="13px" VerticalAlignment="Center"/>-->
+                    <TextBlock  Margin="5" FontSize="13px" VerticalAlignment="Center">
+                        <TextBlock.Text>
+                            <MultiBinding StringFormat="第 {0} 页 / 共 {1} 页">
+                                <Binding ElementName="ucPatchGird" Path="PatchDetailPage.PageNumber"/>
+                                <Binding ElementName="ucPatchGird" Path="PatchDetailPage.PageCount"/>
+                            </MultiBinding>
+                        </TextBlock.Text>
+                    </TextBlock>
+                    <Button x:Name="btnDataNextPage" Content="下一页" Width="55" Margin="5" FontSize="13px" Click="BtnDataNextPage_Click"/>
+                    <Button x:Name="btnDataLastPage" Content="尾页" Width="55" Margin="5" FontSize="13px" Click="BtnDataLastPage_Click"/>
+                    <TextBox x:Name="txtDataPageNumber" Width="55" Margin="5" TextAlignment="Center" FontSize="13px"
+                             Text="{Binding ElementName=ucPatchGird,Path=PatchDetailPage.PageNumber,Mode=OneWay}"
+                             MaxLength="5" PreviewTextInput="TextBox_PreviewTextInput" VerticalContentAlignment="Center"/>
+                    <Button x:Name="btnDataSpeciPage" Content="跳转" Width="55" Margin="5" FontSize="13px" Click="BtnDataSpeciPage_Click"/>
+                </StackPanel>
+
+            </Grid>
+        </Border>
+        
+        
+    </Grid>
+</UserControl>

+ 100 - 0
MV485/uc/UCMonitorData2.xaml.cs

@@ -0,0 +1,100 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace MV485.uc
+{
+    /// <summary>
+    /// UCMonitorData2.xaml 的交互逻辑
+    /// </summary>
+    public partial class UCMonitorData2 : UserControl
+    {
+        public readonly int[] PageSizeOptions = new int[] { 10, 20, 50 };
+
+        public UCMonitorData2()
+        {
+            InitializeComponent();
+        }
+
+        private void BtnAddDevice_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        private void BtnDelDevice_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        private void BtnClearData_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        private void BtnDataFirstPage_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        private void BtnDataPrePage_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        private void BtnDataNextPage_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        private void BtnDataLastPage_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
+        {
+
+        }
+
+        private void BtnDataSpeciPage_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        private void BtnLogViewer_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        private void BtnDelData_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        private void MeterImage_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
+        {
+
+        }
+
+        private void BtnUpdateDevice_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+
+        private void BtnConnectTest_Click(object sender, RoutedEventArgs e)
+        {
+
+        }
+    }
+}