diff --git a/App.xaml.cs b/App.xaml.cs
index 8861b7c..9b2d50d 100644
--- a/App.xaml.cs
+++ b/App.xaml.cs
@@ -22,7 +22,9 @@ namespace WpfApp
/// 如果硬件已绑定且匹配返回true,否则返回false
private static bool CheckHardwareBinding()
{
- string storedHardwareId = "8f07378cbfb5247c6481694a0ba0cb0b74739eddcc91f591623409a45803ee69";
+ //string storedHardwareId = "8f07378cbfb5247c6481694a0ba0cb0b74739eddcc91f591623409a45803ee69";
+ string storedHardwareId = "2703a031ecb416bd4ef9b91a5bd5f8698f745bb9efcbf7da35d251d0491b9cd8";
+
return HardwareInfo.ValidateHardwareId(storedHardwareId);
}
///
@@ -59,6 +61,7 @@ namespace WpfApp
if (!CheckHardwareBinding())
{
MessageBox.Show("检测到硬件环境发生变化,应用程序无法启动!", "警告", MessageBoxButton.OK, MessageBoxImage.Warning);
+ Console.WriteLine($"硬件环境序列号:{HardwareInfo.GetHardwareId()}");
LogService.Log.Info($"硬件环境序列号:{HardwareInfo.GetHardwareId()}");
Shutdown(); // 退出应用程序
return;
@@ -70,7 +73,7 @@ namespace WpfApp
Shutdown(); // 退出应用程序
return;
}
-
+
try
{
// 获取主窗口实例并显示
diff --git a/MainWindow.xaml b/MainWindow.xaml
index e1b0e8d..2f9a386 100644
--- a/MainWindow.xaml
+++ b/MainWindow.xaml
@@ -3,11 +3,373 @@
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:local="clr-namespace:WpfApp"
+ xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
+ xmlns:local="clr-namespace:WpfApp.src.components"
+
mc:Ignorable="d"
- Title="MainWindow" Height="450" Width="800">
+ Title="MainWindow" Height="800" Width="1200">
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs
index a795a32..4211225 100644
--- a/MainWindow.xaml.cs
+++ b/MainWindow.xaml.cs
@@ -1,6 +1,11 @@
using guoke;
+using LiveCharts;
+using LiveCharts.Wpf;
using SqlSugar;
using System.Windows;
+using System.Windows.Navigation;
+using WpfApp.src.view;
+
namespace WpfApp
{
@@ -28,6 +33,164 @@ namespace WpfApp
{
log.Info($"接收到事件:{d.Data}");
});
+
+ #region 曲线测试数据
+ SetWindowTitle("FMSDGAUGE");
+
+ // 传感器1
+ // 初始化Series
+ myChart.Series = new SeriesCollection
+ {
+ // 柱状图
+ new ColumnSeries
+ {
+ Title = "柱状数据",
+ Values = new ChartValues { 20, 10, 12, 5, 9 }
+ },
+ // 标准1
+ new LineSeries
+ {
+ Title = "标准1",
+ Values = new ChartValues { 5, 5, 5, 5, 5 },
+ StrokeThickness = 2,
+ Fill = System.Windows.Media.Brushes.Transparent
+ },
+ // 标准2
+ new LineSeries
+ {
+ Title = "标准2",
+ Values = new ChartValues { 10, 10, 10, 10, 10 },
+ StrokeThickness = 2,
+ Stroke = System.Windows.Media.Brushes.Green,
+ Fill = System.Windows.Media.Brushes.Transparent
+ },
+ // 标准3
+ new LineSeries
+ {
+ Title = "标准3",
+ Values = new ChartValues { 30, 30, 30, 30, 30 },
+ StrokeThickness = 2,
+ Stroke = System.Windows.Media.Brushes.Red,
+ Fill = System.Windows.Media.Brushes.Transparent
+ }
+ };
+
+ // 设置X轴标签
+ myChart.AxisX.Add(new Axis
+ {
+ Title = "",
+ Labels = new[] { "13:27 23", "13:27 45", "13:27 49", "13:27 50", "13:27 55" }
+ });
+
+ // 设置Y轴
+ myChart.AxisY.Add(new Axis
+ {
+ Title = ""
+ });
+
+ // 传感器2
+ // 初始化Series
+ myChart1.Series = new SeriesCollection
+ {
+ // 柱状图
+ new ColumnSeries
+ {
+ Title = "柱状数据",
+ Values = new ChartValues { 20, 10, 12, 5, 9 }
+ },
+ // 标准1
+ new LineSeries
+ {
+ Title = "标准1",
+ Values = new ChartValues { 5, 5, 5, 5, 5 },
+ StrokeThickness = 2,
+ Fill = System.Windows.Media.Brushes.Transparent
+ },
+ // 标准2
+ new LineSeries
+ {
+ Title = "标准2",
+ Values = new ChartValues { 10, 10, 10, 10, 10 },
+ StrokeThickness = 2,
+ Stroke = System.Windows.Media.Brushes.Green,
+ Fill = System.Windows.Media.Brushes.Transparent
+ },
+ // 标准3
+ new LineSeries
+ {
+ Title = "标准3",
+ Values = new ChartValues { 30, 30, 30, 30, 30 },
+ StrokeThickness = 2,
+ Stroke = System.Windows.Media.Brushes.Red,
+ Fill = System.Windows.Media.Brushes.Transparent
+ }
+ };
+
+ // 设置X轴标签
+ myChart1.AxisX.Add(new Axis
+ {
+ Title = "",
+ Labels = new[] { "13:27 23", "13:27 45", "13:27 49", "13:27 50", "13:27 55" }
+ });
+
+ // 设置Y轴
+ myChart1.AxisY.Add(new Axis
+ {
+ Title = ""
+ });
+
+ // 传感器3
+ // 初始化Series
+ myChart2.Series = new SeriesCollection
+ {
+ // 柱状图
+ new ColumnSeries
+ {
+ Title = "柱状数据",
+ Values = new ChartValues { 20, 10, 12, 5, 9 }
+ },
+ // 标准1
+ new LineSeries
+ {
+ Title = "标准1",
+ Values = new ChartValues { 5, 5, 5, 5, 5 },
+ StrokeThickness = 2,
+ Fill = System.Windows.Media.Brushes.Transparent
+ },
+ // 标准2
+ new LineSeries
+ {
+ Title = "标准2",
+ Values = new ChartValues { 10, 10, 10, 10, 10 },
+ StrokeThickness = 2,
+ Stroke = System.Windows.Media.Brushes.Green,
+ Fill = System.Windows.Media.Brushes.Transparent
+ },
+ // 标准3
+ new LineSeries
+ {
+ Title = "标准3",
+ Values = new ChartValues { 30, 30, 30, 30, 30 },
+ StrokeThickness = 2,
+ Stroke = System.Windows.Media.Brushes.Red,
+ Fill = System.Windows.Media.Brushes.Transparent
+ }
+ };
+
+ // 设置X轴标签
+ myChart2.AxisX.Add(new Axis
+ {
+ Title = "",
+ Labels = new[] { "13:27 23", "13:27 45", "13:27 49", "13:27 50", "13:27 55" }
+ });
+
+ // 设置Y轴
+ myChart2.AxisY.Add(new Axis
+ {
+ Title = ""
+ });
+
+ #endregion
}
private void Button_Click(object sender, RoutedEventArgs e)
@@ -40,5 +203,193 @@ namespace WpfApp
{
}
+ ///
+ /// 设置窗体标题的函数
+ ///
+ ///
+ public void SetWindowTitle(string newTitle)
+ {
+ this.Title = newTitle;
+ }
+ // 在 MainWindow 内部
+ ///
+ /// 按钮点击触发文件页面
+ ///
+ ///
+ ///
+ private void OnFilePageButtonClick(object sender, RoutedEventArgs e)
+ {
+ FilePage filePage = new FilePage();
+ NavigationWindow navWin = new NavigationWindow();
+
+ navWin.Width = 810;
+ navWin.Height = 600;
+ navWin.ResizeMode = ResizeMode.NoResize;
+ navWin.Content = filePage;
+ navWin.ShowsNavigationUI = false;
+ navWin.Title = "记录列表";
+
+
+ // ✅ 新增:设定父窗口、样式与居中弹出
+ navWin.Owner = Application.Current.MainWindow; // 绑定主窗口
+ navWin.WindowStartupLocation = WindowStartupLocation.CenterOwner; // 居中弹出
+ navWin.WindowStyle = WindowStyle.ToolWindow;
+
+ // ✅ 改这里:Show() 改为 ShowDialog() 实现模态窗口
+ navWin.ShowDialog();
+ }
+
+
+ ///
+ /// 按钮点击触发配置页面
+ ///
+ ///
+ ///
+ private void OnConfigPageButtonClick(object sender, RoutedEventArgs e)
+ {
+ ConfigPage configPage = new ConfigPage();
+ NavigationWindow navWin = new NavigationWindow();
+ navWin.Content = configPage;
+ navWin.ShowsNavigationUI = false;
+ navWin.Width = 972;
+ navWin.Height = 648;
+ navWin.Title = "配置";
+ navWin.ResizeMode = ResizeMode.NoResize;
+
+
+
+ // ✅ 新增:设定父窗口、样式与居中弹出
+ navWin.Owner = Application.Current.MainWindow; // 绑定主窗口
+ navWin.WindowStartupLocation = WindowStartupLocation.CenterOwner; // 居中弹出
+ navWin.WindowStyle = WindowStyle.ToolWindow;
+
+ // ✅ 改这里:Show() 改为 ShowDialog() 实现模态窗口
+ navWin.ShowDialog();
+ }
+
+ ///
+ /// 按钮点击触发标准基准页面
+ ///
+ ///
+ ///
+ private void OnStandardPageButtonClick(object sender, RoutedEventArgs e)
+ {
+ StandardPage standardPage = new StandardPage();
+ NavigationWindow navWin = new NavigationWindow();
+ navWin.Width = 1440;
+ navWin.Height = 960;
+ navWin.ResizeMode = ResizeMode.NoResize;
+ navWin.Content = standardPage;
+ navWin.ShowsNavigationUI = false;
+ navWin.Title = "主标定";
+
+
+ // ✅ 新增:设定父窗口、样式与居中弹出
+ navWin.Owner = Application.Current.MainWindow; // 绑定主窗口
+ navWin.WindowStartupLocation = WindowStartupLocation.CenterOwner; // 居中弹出
+ navWin.WindowStyle = WindowStyle.ToolWindow;
+
+ // ✅ 改这里:Show() 改为 ShowDialog() 实现模态窗口
+ navWin.ShowDialog();
+ }
+
+ ///
+ /// 按钮点击触发Gauge页面
+ ///
+ ///
+ ///
+ private void OnGaugePageButtonClick(object sender, RoutedEventArgs e)
+ {
+ GaugePage gaugePage = new GaugePage();
+ NavigationWindow navWin = new NavigationWindow();
+ navWin.Content = gaugePage;
+ navWin.ShowsNavigationUI = false;
+ navWin.Width = 1080;
+ navWin.Height = 720;
+ navWin.Title = "Gauge R&&R";
+
+ // ✅ 新增:设定父窗口、样式与居中弹出
+ navWin.Owner = Application.Current.MainWindow; // 绑定主窗口
+ navWin.WindowStartupLocation = WindowStartupLocation.CenterOwner; // 居中弹出
+ navWin.WindowStyle = WindowStyle.ToolWindow;
+
+ // ✅ 改这里:Show() 改为 ShowDialog() 实现模态窗口
+ navWin.ShowDialog();
+ }
+
+
+ ///
+ /// 按钮点击触发CgCgk页面
+ ///
+ ///
+ ///
+ private void OnCgCgkPageButtonClick(object sender, RoutedEventArgs e)
+ {
+ CgCgkPage cgCgkPage = new CgCgkPage();
+ NavigationWindow navWin = new NavigationWindow();
+ navWin.Content = cgCgkPage;
+ navWin.ShowsNavigationUI = false;
+ navWin.Title = "CgCgk";
+
+
+ // ✅ 新增:设定父窗口、样式与居中弹出
+ navWin.Owner = Application.Current.MainWindow; // 绑定主窗口
+ navWin.WindowStartupLocation = WindowStartupLocation.CenterOwner; // 居中弹出
+ navWin.WindowStyle = WindowStyle.ToolWindow;
+
+ // ✅ 改这里:Show() 改为 ShowDialog() 实现模态窗口
+ navWin.ShowDialog();
+ }
+
+
+ ///
+ /// 按钮点击触发系统设置页面
+ ///
+ ///
+ ///
+ private void OnSysSetPageButtonClick(object sender, RoutedEventArgs e)
+ {
+ SysSetPage sysSetPage = new SysSetPage();
+ NavigationWindow navWin = new NavigationWindow();
+ navWin.Width = 810;
+ navWin.Height = 600;
+ navWin.ResizeMode = ResizeMode.NoResize;
+ navWin.Content = sysSetPage;
+ navWin.ShowsNavigationUI = false;
+ navWin.Title = "系统设置";
+
+
+ // ✅ 新增:设定父窗口、样式与居中弹出
+ navWin.Owner = Application.Current.MainWindow; // 绑定主窗口
+ navWin.WindowStartupLocation = WindowStartupLocation.CenterOwner; // 居中弹出
+ navWin.WindowStyle = WindowStyle.ToolWindow;
+
+ // ✅ 改这里:Show() 改为 ShowDialog() 实现模态窗口
+ navWin.ShowDialog();
+ }
+
+
+ ///
+ /// 按钮点击触发关闭页面
+ ///
+ ///
+ ///
+ private void OnCloseMainWindowButtonClick(object sender, RoutedEventArgs e)
+ {
+ this.Close();
+
+ }
+
+
+ ///
+ /// 测试按钮
+ ///
+ ///
+ ///
+ private void OnDemoButtonClick(object sender, RoutedEventArgs e)
+ {
+ //LineBarChartDemo lineBarChartDemo = new LineBarChartDemo();
+ //lineBarChartDemo.Show();
+ }
}
}
\ No newline at end of file
diff --git a/WpfApp.csproj b/WpfApp.csproj
index d49af5f..2536c12 100644
--- a/WpfApp.csproj
+++ b/WpfApp.csproj
@@ -8,8 +8,34 @@
true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -22,4 +48,8 @@
+
+
+
+
diff --git a/src/components/SensorChart.xaml b/src/components/SensorChart.xaml
new file mode 100644
index 0000000..3f0dd86
--- /dev/null
+++ b/src/components/SensorChart.xaml
@@ -0,0 +1,214 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/SensorChart.xaml.cs b/src/components/SensorChart.xaml.cs
new file mode 100644
index 0000000..63af6b1
--- /dev/null
+++ b/src/components/SensorChart.xaml.cs
@@ -0,0 +1,243 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Media;
+
+namespace WpfApp.src.components
+{
+ ///
+ /// SensorChart.xaml 的交互逻辑
+ ///
+ public partial class SensorChart : UserControl, INotifyPropertyChanged
+ {
+ public SensorChart()
+ {
+ InitializeComponent();
+ DataContext = this;
+
+ // 设置默认值
+ SensorName = "传感器";
+ HeaderBackground = new SolidColorBrush(Color.FromRgb(230, 243, 255)); // #E6F3FF
+ Value = 0;
+ RedLineValues = new List();
+ }
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ protected virtual void OnPropertyChanged(string propertyName)
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
+
+ #region 依赖属性
+
+ // 传感器名称
+ public static readonly DependencyProperty SensorNameProperty =
+ DependencyProperty.Register("SensorName", typeof(string), typeof(SensorChart),
+ new PropertyMetadata("传感器", OnSensorNameChanged));
+
+ public string SensorName
+ {
+ get { return (string)GetValue(SensorNameProperty); }
+ set { SetValue(SensorNameProperty, value); }
+ }
+
+ private static void OnSensorNameChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ var control = d as SensorChart;
+ control?.OnPropertyChanged(nameof(SensorName));
+ }
+
+ // 标题背景色
+ public static readonly DependencyProperty HeaderBackgroundProperty =
+ DependencyProperty.Register("HeaderBackground", typeof(Brush), typeof(SensorChart),
+ new PropertyMetadata(new SolidColorBrush(Color.FromRgb(230, 243, 255)), OnHeaderBackgroundChanged));
+
+ public Brush HeaderBackground
+ {
+ get { return (Brush)GetValue(HeaderBackgroundProperty); }
+ set { SetValue(HeaderBackgroundProperty, value); }
+ }
+
+ private static void OnHeaderBackgroundChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ var control = d as SensorChart;
+ control?.OnPropertyChanged(nameof(HeaderBackground));
+ }
+
+ // 数值
+ public static readonly DependencyProperty ValueProperty =
+ DependencyProperty.Register("Value", typeof(double), typeof(SensorChart),
+ new PropertyMetadata(0.0, OnValueChanged));
+
+ public double Value
+ {
+ get { return (double)GetValue(ValueProperty); }
+ set { SetValue(ValueProperty, value); }
+ }
+
+ private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ var control = d as SensorChart;
+ control?.UpdateBarPosition();
+ }
+
+ // 红线数值列表
+ public static readonly DependencyProperty RedLineValuesProperty =
+ DependencyProperty.Register("RedLineValues", typeof(List), typeof(SensorChart),
+ new PropertyMetadata(new List(), OnRedLineValuesChanged));
+
+ public List RedLineValues
+ {
+ get { return (List)GetValue(RedLineValuesProperty); }
+ set { SetValue(RedLineValuesProperty, value); }
+ }
+
+ private static void OnRedLineValuesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ var control = d as SensorChart;
+ control?.UpdateRedLinePositions();
+ }
+
+ #endregion
+
+ #region 计算属性
+
+ private double _barTop;
+ public double BarTop
+ {
+ get { return _barTop; }
+ private set
+ {
+ _barTop = value;
+ OnPropertyChanged(nameof(BarTop));
+ }
+ }
+
+ private double _barHeight;
+ public double BarHeight
+ {
+ get { return _barHeight; }
+ private set
+ {
+ _barHeight = value;
+ OnPropertyChanged(nameof(BarHeight));
+ }
+ }
+
+ private List _redLinePositions = new List();
+ public List RedLinePositions
+ {
+ get { return _redLinePositions; }
+ private set
+ {
+ _redLinePositions = value;
+ OnPropertyChanged(nameof(RedLinePositions));
+ }
+ }
+
+ #endregion
+
+ #region 私有方法
+
+ ///
+ /// 将数值转换为Y坐标位置
+ /// 刻度范围:40 到 -40,对应Y坐标:20 到 420
+ ///
+ /// 数值
+ /// Y坐标
+ private double ValueToY(double value)
+ {
+ // 限制数值范围
+ value = Math.Max(-40, Math.Min(40, value));
+
+ // 线性映射:40对应Y=20,-40对应Y=420
+ // Y = 220 - value * 5
+ return 220 - value * 5;
+ }
+
+ ///
+ /// 更新柱状图位置
+ ///
+ private void UpdateBarPosition()
+ {
+ if (Value >= 0)
+ {
+ // 正值:从0线向上
+ BarTop = ValueToY(Value);
+ BarHeight = ValueToY(0) - ValueToY(Value);
+ }
+ else
+ {
+ // 负值:从0线向下
+ BarTop = ValueToY(0);
+ BarHeight = ValueToY(Value) - ValueToY(0);
+ }
+ }
+
+ ///
+ /// 更新红线位置
+ ///
+ private void UpdateRedLinePositions()
+ {
+ var positions = new List();
+ if (RedLineValues != null)
+ {
+ foreach (var value in RedLineValues)
+ {
+ positions.Add(ValueToY(value));
+ }
+ }
+ RedLinePositions = positions;
+ }
+
+ #endregion
+
+ #region 公共方法
+
+ ///
+ /// 设置传感器数据
+ ///
+ /// 传感器名称
+ /// 数值
+ /// 红线数值列表
+ /// 标题背景色
+ public void SetSensorData(string name, double value, List redLines = null, Color? headerColor = null)
+ {
+ SensorName = name;
+ Value = value;
+
+ if (redLines != null)
+ {
+ RedLineValues = new List(redLines);
+ }
+
+ if (headerColor.HasValue)
+ {
+ HeaderBackground = new SolidColorBrush(headerColor.Value);
+ }
+ }
+
+ ///
+ /// 添加红线
+ ///
+ /// 红线数值
+ public void AddRedLine(double value)
+ {
+ var lines = new List(RedLineValues) { value };
+ RedLineValues = lines;
+ }
+
+ ///
+ /// 清除所有红线
+ ///
+ public void ClearRedLines()
+ {
+ RedLineValues = new List();
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/src/public/Icons/main1-file-icon.png b/src/public/Icons/main1-file-icon.png
new file mode 100644
index 0000000..09fa785
Binary files /dev/null and b/src/public/Icons/main1-file-icon.png differ
diff --git a/src/public/Icons/main2-config-icon.png b/src/public/Icons/main2-config-icon.png
new file mode 100644
index 0000000..4155c24
Binary files /dev/null and b/src/public/Icons/main2-config-icon.png differ
diff --git a/src/public/Icons/main3-standard-icon.png b/src/public/Icons/main3-standard-icon.png
new file mode 100644
index 0000000..de4bb78
Binary files /dev/null and b/src/public/Icons/main3-standard-icon.png differ
diff --git a/src/public/Icons/main4-detection-icon.png b/src/public/Icons/main4-detection-icon.png
new file mode 100644
index 0000000..e1feda5
Binary files /dev/null and b/src/public/Icons/main4-detection-icon.png differ
diff --git a/src/public/Icons/main5-gauge-icon.png b/src/public/Icons/main5-gauge-icon.png
new file mode 100644
index 0000000..4ab625e
Binary files /dev/null and b/src/public/Icons/main5-gauge-icon.png differ
diff --git a/src/public/Icons/main6-cgCgk-icon.png b/src/public/Icons/main6-cgCgk-icon.png
new file mode 100644
index 0000000..4ab625e
Binary files /dev/null and b/src/public/Icons/main6-cgCgk-icon.png differ
diff --git a/src/public/Icons/main7-sysSet-icon.png b/src/public/Icons/main7-sysSet-icon.png
new file mode 100644
index 0000000..509aefc
Binary files /dev/null and b/src/public/Icons/main7-sysSet-icon.png differ
diff --git a/src/public/Icons/main8-exit-icon.png b/src/public/Icons/main8-exit-icon.png
new file mode 100644
index 0000000..02ae0b9
Binary files /dev/null and b/src/public/Icons/main8-exit-icon.png differ
diff --git a/src/view/CgCgkPage.xaml b/src/view/CgCgkPage.xaml
new file mode 100644
index 0000000..e8f41c8
--- /dev/null
+++ b/src/view/CgCgkPage.xaml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
diff --git a/src/view/CgCgkPage.xaml.cs b/src/view/CgCgkPage.xaml.cs
new file mode 100644
index 0000000..3f98973
--- /dev/null
+++ b/src/view/CgCgkPage.xaml.cs
@@ -0,0 +1,28 @@
+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 WpfApp.src.view
+{
+ ///
+ /// CgCgkPage.xaml 的交互逻辑
+ ///
+ public partial class CgCgkPage : Page
+ {
+ public CgCgkPage()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/src/view/ConfigPage.xaml b/src/view/ConfigPage.xaml
new file mode 100644
index 0000000..3109f2f
--- /dev/null
+++ b/src/view/ConfigPage.xaml
@@ -0,0 +1,243 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/view/ConfigPage.xaml.cs b/src/view/ConfigPage.xaml.cs
new file mode 100644
index 0000000..a9e2e74
--- /dev/null
+++ b/src/view/ConfigPage.xaml.cs
@@ -0,0 +1,137 @@
+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 WpfApp.src.view
+{
+ ///
+ /// ConfigPage.xaml 的交互逻辑
+ ///
+ public partial class ConfigPage : Page
+ {
+ // 传感器数据字典,存储每个传感器的公差设定值
+ private Dictionary sensorData;
+
+ public ConfigPage()
+ {
+ InitializeComponent();
+ InitializeSensorData();
+ }
+
+ // 初始化传感器数据
+ private void InitializeSensorData()
+ {
+ sensorData = new Dictionary
+ {
+ { 1, new SensorToleranceData { MaxTolerance = "9.00", BaseTolerance = "72.9410", MinTolerance = "-9.00" } },
+ { 2, new SensorToleranceData { MaxTolerance = "8.50", BaseTolerance = "72.8500", MinTolerance = "-8.50" } },
+ { 3, new SensorToleranceData { MaxTolerance = "7.80", BaseTolerance = "72.7800", MinTolerance = "-7.80" } },
+ { 4, new SensorToleranceData { MaxTolerance = "6.90", BaseTolerance = "72.6900", MinTolerance = "-6.90" } }
+ };
+ }
+
+ // 传感器标签页点击事件处理
+ private void SensorTab_Click(object sender, RoutedEventArgs e)
+ {
+ Button clickedButton = sender as Button;
+ if (clickedButton == null) return;
+
+ int sensorIndex = int.Parse(clickedButton.Tag.ToString());
+
+ // 保存当前传感器的数据
+ SaveCurrentSensorData();
+
+ // 更新标签页样式
+ UpdateTabStyles(sensorIndex);
+
+ // 加载选中传感器的数据
+ LoadSensorData(sensorIndex);
+ }
+
+ // 保存当前传感器的数据
+ private void SaveCurrentSensorData()
+ {
+ // 获取当前选中的传感器索引
+ int currentSensorIndex = GetCurrentSelectedSensorIndex();
+
+ if (sensorData.ContainsKey(currentSensorIndex))
+ {
+ sensorData[currentSensorIndex].MaxTolerance = MaxToleranceTextBox.Text;
+ sensorData[currentSensorIndex].BaseTolerance = BaseToleranceTextBox.Text;
+ sensorData[currentSensorIndex].MinTolerance = MinToleranceTextBox.Text;
+ }
+ }
+
+ // 获取当前选中的传感器索引
+ private int GetCurrentSelectedSensorIndex()
+ {
+ if (SensorTab1.Background is SolidColorBrush brush1 && brush1.Color == ((SolidColorBrush)new BrushConverter().ConvertFrom("#E6F3FF")).Color)
+ return 1;
+ if (SensorTab2.Background is SolidColorBrush brush2 && brush2.Color == ((SolidColorBrush)new BrushConverter().ConvertFrom("#E6F3FF")).Color)
+ return 2;
+ if (SensorTab3.Background is SolidColorBrush brush3 && brush3.Color == ((SolidColorBrush)new BrushConverter().ConvertFrom("#E6F3FF")).Color)
+ return 3;
+ if (SensorTab4.Background is SolidColorBrush brush4 && brush4.Color == ((SolidColorBrush)new BrushConverter().ConvertFrom("#E6F3FF")).Color)
+ return 4;
+ return 1; // 默认返回传感器1
+ }
+
+ // 更新标签页样式
+ private void UpdateTabStyles(int selectedIndex)
+ {
+ // 重置所有标签页样式
+ SensorTab1.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#F0F0F0"));
+ SensorTab2.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#F0F0F0"));
+ SensorTab3.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#F0F0F0"));
+ SensorTab4.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#F0F0F0"));
+
+ // 设置选中标签页样式
+ switch (selectedIndex)
+ {
+ case 1:
+ SensorTab1.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#E6F3FF"));
+ break;
+ case 2:
+ SensorTab2.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#E6F3FF"));
+ break;
+ case 3:
+ SensorTab3.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#E6F3FF"));
+ break;
+ case 4:
+ SensorTab4.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#E6F3FF"));
+ break;
+ }
+ }
+
+ // 加载传感器数据
+ private void LoadSensorData(int sensorIndex)
+ {
+ if (sensorData.ContainsKey(sensorIndex))
+ {
+ var data = sensorData[sensorIndex];
+ MaxToleranceTextBox.Text = data.MaxTolerance;
+ BaseToleranceTextBox.Text = data.BaseTolerance;
+ MinToleranceTextBox.Text = data.MinTolerance;
+ }
+ }
+ }
+
+ // 传感器公差数据类
+ public class SensorToleranceData
+ {
+ public string MaxTolerance { get; set; }
+ public string BaseTolerance { get; set; }
+ public string MinTolerance { get; set; }
+ }
+}
diff --git a/src/view/FilePage.xaml b/src/view/FilePage.xaml
new file mode 100644
index 0000000..cd13e26
--- /dev/null
+++ b/src/view/FilePage.xaml
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/view/FilePage.xaml.cs b/src/view/FilePage.xaml.cs
new file mode 100644
index 0000000..0fcbbdc
--- /dev/null
+++ b/src/view/FilePage.xaml.cs
@@ -0,0 +1,153 @@
+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 WpfApp.src.view
+{
+ ///
+ /// FilePage.xaml 的交互逻辑
+ ///
+ public partial class FilePage : Page
+ {
+ public FilePage()
+ {
+ InitializeComponent();
+ LoadSampleData();
+ }
+
+ private void LoadSampleData()
+ {
+ // 清空现有项目
+ RecordListBox.Items.Clear();
+
+ // 添加示例数据
+ var records = new List
+ {
+ "1. GGG[2021-11-17 7:39:50]",
+ "2. MTU SG2000[2021-12-2 7:41:55]",
+ "3. JX493ZQ4[2022-1-8 11:22:42]",
+ "4. JX493ZQ5A[2022-2-15 1:26:38]",
+ "5. FOTON D01[2022-9-1 9:06:43]",
+ "6. PUMA2.0[2022-9-15 8:47:59]",
+ "7. PUMA2.2[2022-9-21 7:50:39]",
+ "8. SAIC D20[2022-10-10 8:27:46]",
+ "9. WEICHAI WP2H[2023-3-30 8:46:02]",
+ "10. JMC PUMA UPG 2.0[2023-7-10 17:07:07]",
+ "11. BFCEC ISF2.8L F2020 NS6[2023-7-10 17:21:50]",
+ "12. 12[2023-8-21 14:44:10]",
+ "13. GME T4[2023-10-2 8:55:38]",
+ "14. GW EN01[2023-10-4 8:12:50]",
+ "15. GAC P26 2.0PMI[2023-11-9 7:44:42]",
+ "16. NU PE2.0 TGDI[2024-5-2 11:07:36]",
+ "17. M254 E20[2024-7-2 10:08:06]",
+ "18. NU PE2.0MPI[2024-10-29 10:45:14]"
+ };
+
+ foreach (var record in records)
+ {
+ RecordListBox.Items.Add(record);
+ }
+ }
+
+ private void SearchButton_Click(object sender, RoutedEventArgs e)
+ {
+ string searchText = SearchTextBox.Text.Trim();
+ if (string.IsNullOrEmpty(searchText))
+ {
+ LoadSampleData(); // 重新加载所有数据
+ return;
+ }
+
+ // 过滤数据
+ RecordListBox.Items.Clear();
+ var allRecords = new List
+ {
+ "1. GGG[2021-11-17 7:39:50]",
+ "2. MTU SG2000[2021-12-2 7:41:55]",
+ "3. JX493ZQ4[2022-1-8 11:22:42]",
+ "4. JX493ZQ5A[2022-2-15 1:26:38]",
+ "5. FOTON D01[2022-9-1 9:06:43]",
+ "6. PUMA2.0[2022-9-15 8:47:59]",
+ "7. PUMA2.2[2022-9-21 7:50:39]",
+ "8. SAIC D20[2022-10-10 8:27:46]",
+ "9. WEICHAI WP2H[2023-3-30 8:46:02]",
+ "10. JMC PUMA UPG 2.0[2023-7-10 17:07:07]",
+ "11. BFCEC ISF2.8L F2020 NS6[2023-7-10 17:21:50]",
+ "12. 12[2023-8-21 14:44:10]",
+ "13. GME T4[2023-10-2 8:55:38]",
+ "14. GW EN01[2023-10-4 8:12:50]",
+ "15. GAC P26 2.0PMI[2023-11-9 7:44:42]",
+ "16. NU PE2.0 TGDI[2024-5-2 11:07:36]",
+ "17. M254 E20[2024-7-2 10:08:06]",
+ "18. NU PE2.0MPI[2024-10-29 10:45:14]"
+ };
+
+ var filteredRecords = allRecords.Where(r => r.ToLower().Contains(searchText.ToLower())).ToList();
+ foreach (var record in filteredRecords)
+ {
+ RecordListBox.Items.Add(record);
+ }
+ }
+
+ private void DeleteButton_Click(object sender, RoutedEventArgs e)
+ {
+ if (RecordListBox.SelectedItem != null)
+ {
+ var result = MessageBox.Show("确定要删除选中的记录吗?", "确认删除",
+ MessageBoxButton.YesNo, MessageBoxImage.Question);
+
+ if (result == MessageBoxResult.Yes)
+ {
+ RecordListBox.Items.Remove(RecordListBox.SelectedItem);
+ }
+ }
+ else
+ {
+ MessageBox.Show("请先选择要删除的记录。", "提示",
+ MessageBoxButton.OK, MessageBoxImage.Information);
+ }
+ }
+
+ private void SelectButton_Click(object sender, RoutedEventArgs e)
+ {
+ if (RecordListBox.SelectedItem != null)
+ {
+ string selectedRecord = RecordListBox.SelectedItem.ToString();
+ MessageBox.Show($"已选择记录:{selectedRecord}", "选择确认",
+ MessageBoxButton.OK, MessageBoxImage.Information);
+
+ // 这里可以添加实际的选择逻辑,比如返回到主界面或执行其他操作
+ }
+ else
+ {
+ MessageBox.Show("请先选择一条记录。", "提示",
+ MessageBoxButton.OK, MessageBoxImage.Information);
+ }
+ }
+
+ private void CloseButton_Click(object sender, RoutedEventArgs e)
+ {
+ // 关闭当前页面或返回上一页
+ if (NavigationService.CanGoBack)
+ {
+ NavigationService.GoBack();
+ }
+ else
+ {
+ // 如果无法返回,可以关闭窗口或执行其他操作
+ Window.GetWindow(this)?.Close();
+ }
+ }
+ }
+}
diff --git a/src/view/GaugePage.xaml b/src/view/GaugePage.xaml
new file mode 100644
index 0000000..ab34770
--- /dev/null
+++ b/src/view/GaugePage.xaml
@@ -0,0 +1,267 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/view/GaugePage.xaml.cs b/src/view/GaugePage.xaml.cs
new file mode 100644
index 0000000..03cb161
--- /dev/null
+++ b/src/view/GaugePage.xaml.cs
@@ -0,0 +1,28 @@
+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 WpfApp.src.view
+{
+ ///
+ /// GaugePage.xaml 的交互逻辑
+ ///
+ public partial class GaugePage : Page
+ {
+ public GaugePage()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/src/view/StandardPage.xaml b/src/view/StandardPage.xaml
new file mode 100644
index 0000000..602a4f4
--- /dev/null
+++ b/src/view/StandardPage.xaml
@@ -0,0 +1,259 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/view/StandardPage.xaml.cs b/src/view/StandardPage.xaml.cs
new file mode 100644
index 0000000..727377b
--- /dev/null
+++ b/src/view/StandardPage.xaml.cs
@@ -0,0 +1,28 @@
+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 WpfApp.src.view
+{
+ ///
+ /// StandardPage.xaml 的交互逻辑
+ ///
+ public partial class StandardPage : Page
+ {
+ public StandardPage()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/src/view/SysSetPage.xaml b/src/view/SysSetPage.xaml
new file mode 100644
index 0000000..f11dd7a
--- /dev/null
+++ b/src/view/SysSetPage.xaml
@@ -0,0 +1,283 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/view/SysSetPage.xaml.cs b/src/view/SysSetPage.xaml.cs
new file mode 100644
index 0000000..7e09eff
--- /dev/null
+++ b/src/view/SysSetPage.xaml.cs
@@ -0,0 +1,102 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+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 WpfApp.src.view
+{
+ ///
+ /// SysSetPage.xaml 的交互逻辑
+ ///
+ public partial class SysSetPage : Page
+ {
+ public ObservableCollection SensorSettings { get; set; }
+ public ObservableCollection SensorConfigs { get; set; }
+
+ public SysSetPage()
+ {
+ InitializeComponent();
+ InitializeData();
+ DataContext = this;
+ }
+
+ private void InitializeData()
+ {
+ // 初始化传感器设置数据
+ SensorSettings = new ObservableCollection
+ {
+ new SensorSettingItem { Name = "A1:130BC32P09", ScaleValue = "0.71777", Progress = 0.71777 },
+ new SensorSettingItem { Name = "A2:130BC32P10", ScaleValue = "0.00000", Progress = 0.0 },
+ new SensorSettingItem { Name = "A3:130BC32P08", ScaleValue = "0.73578", Progress = 0.73578 },
+ new SensorSettingItem { Name = "", ScaleValue = "0.00000", Progress = 0.0 }
+ };
+
+ // 初始化传感器配置数据
+ SensorConfigs = new ObservableCollection
+ {
+ new SensorConfigItem { Sensor1Id = "130BC32P09", Id = "5", Range = "5", Name = "A1" },
+ new SensorConfigItem { Sensor1Id = "130BC32P10", Id = "5", Range = "5", Name = "A2" },
+ new SensorConfigItem { Sensor1Id = "130BC32P08", Id = "6", Range = "6", Name = "A3" },
+ new SensorConfigItem { Sensor1Id = "", Id = "", Range = "", Name = "" }
+ };
+
+ // 绑定数据到DataGrid
+ //SensorSettingsGrid.ItemsSource = SensorSettings;
+ //SensorConfigGrid.ItemsSource = SensorConfigs;
+
+
+ }
+
+ private void SelectSensorButton_Click(object sender, RoutedEventArgs e)
+ {
+ // 选择传感器按钮点击事件
+ MessageBox.Show("选择传感器功能待实现");
+ }
+
+ private void SaveButton_Click(object sender, RoutedEventArgs e)
+ {
+ // 保存按钮点击事件
+ MessageBox.Show("保存成功");
+ }
+
+ private void CancelButton_Click(object sender, RoutedEventArgs e)
+ {
+ // 取消按钮点击事件
+ MessageBox.Show("已取消");
+ }
+
+ private void ConfirmButton_Click(object sender, RoutedEventArgs e)
+ {
+ // 确定按钮点击事件
+ MessageBox.Show("确定");
+ }
+ }
+
+ // 传感器设置数据模型
+ public class SensorSettingItem
+ {
+ public string Name { get; set; }
+ public string ScaleValue { get; set; }
+ public double Progress { get; set; }
+ }
+
+ // 传感器配置数据模型
+ public class SensorConfigItem
+ {
+ public string Sensor1Id { get; set; }
+ public string Id { get; set; }
+ public string Range { get; set; }
+ public string Name { get; set; }
+ }
+}