You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

164 lines
5.8 KiB

using LiveChartsCore;
using LiveChartsCore.Defaults;
using LiveChartsCore.Kernel.Sketches;
using LiveChartsCore.SkiaSharpView;
using LiveChartsCore.SkiaSharpView.Painting;
using Newtonsoft.Json.Linq;
using ScottPlot;
using ScottPlot.Plottables;
using ScottPlot.Statistics;
using SkiaSharp;
using SunlightCentralizedControlManagement_SCCM_.ViewModel;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Data;
using System.Data.Entity.Core.Common.CommandTrees.ExpressionBuilder;
using System.Linq;
using System.Runtime.Serialization;
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.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
namespace SunlightCentralizedControlManagement_SCCM_.UserControls
{
/// <summary>
/// info.xaml 的交互逻辑
/// </summary>
public partial class info : UserControl, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
public void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
if (propertyName != null)
{
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
private ObservableCollection<DateTimePoint> MTH_values = new ObservableCollection<DateTimePoint>();
public ObservableCollection<ISeries> _series { get; set; }
public ObservableCollection<ISeries> Series
{
get => _series;
set
{
_series = value;
OnPropertyChanged(nameof(Series));
}
}
//x轴时间格式
public Axis[] XAxes { get; set; } =
{
new DateTimeAxis(TimeSpan.FromSeconds(5) , date => date.ToString("HH:mm"))
{
MinLimit = DateTime.Now.AddHours(-6).Ticks,
MaxLimit = DateTime.Now.AddHours(0.5).Ticks,
CrosshairLabelsBackground = SKColors.DarkGray.AsLvcColor(),
CrosshairLabelsPaint = new SolidColorPaint(SKColors.DarkSlateBlue, 1),
CrosshairPaint = new SolidColorPaint(SKColors.DarkSlateGray, 1),
},
};
//颜色
private static readonly SKColor s_blue = new SKColor(25, 118, 210);
private static readonly SKColor s_red = new SKColor(229, 57, 53);
public ICartesianAxis[] YAxes { get; set; } ={
new Axis //y在此轴上缩放
{
MinLimit =0,
MaxLimit =160,
NamePadding = new LiveChartsCore.Drawing.Padding(0, 20),
Padding = new LiveChartsCore.Drawing.Padding(0, 0, 20, 0),
TextSize = 12,
LabelsPaint = new SolidColorPaint(s_blue),
TicksPaint = new SolidColorPaint(s_blue),
SubticksPaint = new SolidColorPaint(s_blue),
DrawTicksPath = true,
CrosshairSnapEnabled = true,
Position = LiveChartsCore.Measure.AxisPosition.Start
},//温度轴
};
public info()
{
InitializeComponent();
DataContext = this;
}
public void DataAdd(DateTime dateTime, double dat)
{
Dispatcher.Invoke(() =>
{
// 添加新数据点
MTH_values.Add(new DateTimePoint(dateTime, dat));
// 更新X轴范围,始终保持最近6小时
XAxes[0].MinLimit = dateTime.AddHours(-6).Ticks;
XAxes[0].MaxLimit = dateTime.AddMinutes(1).Ticks;
// 移除6小时前的旧数据
while (MTH_values.Count > 0 &&
MTH_values[0].DateTime < dateTime.AddHours(-6))
{
MTH_values.RemoveAt(0);
}
});
}
public void DataROW(DataRow[] dataRows)
{
DateTime dateTime = DateTime.Now;
foreach (DataRow row in dataRows)
{
// 添加新数据点
MTH_values.Add(new DateTimePoint((DateTime)row["DateTime"], (double)row["DAT"]));
}
Dispatcher.Invoke(() =>
{
// 更新X轴范围,始终保持最近6小时
XAxes[0].MinLimit = dateTime.AddHours(-6).Ticks;
XAxes[0].MaxLimit = dateTime.AddMinutes(1).Ticks;
});
}
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
// 初始化系列
Series = new ObservableCollection<ISeries>
{
new LineSeries<DateTimePoint>
{
Name = Properties.Resources.Temperature,
Values = MTH_values,
Stroke = new SolidColorPaint(s_red, 2),
GeometrySize = 0,
GeometryStroke = new SolidColorPaint(s_red, 2),
Fill = null,
LineSmoothness = 0,
ScalesYAt = 0,
}
};
}
}
}