93 lines
3.4 KiB
C#
93 lines
3.4 KiB
C#
using LiveCharts.Wpf;
|
|
using System.Windows.Media;
|
|
using System.Windows.Threading;
|
|
using WpfApp.src.config;
|
|
using WpfApp.Utils;
|
|
|
|
namespace WpfApp.Services
|
|
{
|
|
/// <summary>
|
|
/// Chart 管理器 - 负责图表初始化和实时更新
|
|
/// </summary>
|
|
public class ChartManager
|
|
{
|
|
private readonly Dispatcher dispatcher;
|
|
|
|
public ChartManager(Dispatcher uiDispatcher)
|
|
{
|
|
dispatcher = uiDispatcher;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 初始化图表
|
|
/// </summary>
|
|
public void InitCharts(params CartesianChart[] charts)
|
|
{
|
|
var labels = new[] { "13:27 23", "13:27 45", "13:27 49", "13:27 50", "13:27 55" };
|
|
|
|
var config = new ChartConfig
|
|
{
|
|
ColumnData = new List<double> { 20, 10, 12, 5, 9 },
|
|
Labels = labels.ToList(),
|
|
LineConfigs = new List<LineConfig>
|
|
{
|
|
new LineConfig { Title = "标准1", Values = Enumerable.Repeat(5.0,5).ToList(), Stroke = Brushes.Blue },
|
|
new LineConfig { Title = "标准2", Values = Enumerable.Repeat(10.0,5).ToList(), Stroke = Brushes.Green },
|
|
new LineConfig { Title = "标准3", Values = Enumerable.Repeat(30.0,5).ToList(), Stroke = Brushes.Red, Unit="A" }
|
|
}
|
|
};
|
|
|
|
foreach (var chart in charts)
|
|
{
|
|
InitChart.InitCartesianChart(chart, config);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 动态更新图表数据(线程安全)
|
|
/// </summary>
|
|
public void UpdateChart(CartesianChart chart, List<double> columnData, List<LineConfig> lineData)
|
|
{
|
|
dispatcher.Invoke(() =>
|
|
{
|
|
var config = new ChartConfig
|
|
{
|
|
ColumnData = columnData,
|
|
Labels = chart.AxisX[0].Labels.ToList(),
|
|
LineConfigs = lineData
|
|
};
|
|
InitChart.InitCartesianChart(chart, config);
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// 模拟后台数据采集并实时刷新图表
|
|
/// </summary>
|
|
public void StartAutoUpdate(CartesianChart chart, CancellationToken token)
|
|
{
|
|
Task.Run(async () =>
|
|
{
|
|
var rand = new Random();
|
|
|
|
while (!token.IsCancellationRequested)
|
|
{
|
|
// 模拟采集数据
|
|
var columnData = Enumerable.Range(0, 5).Select(_ => rand.NextDouble() * 50).ToList();
|
|
var lineData = new List<LineConfig>
|
|
{
|
|
new LineConfig { Title = "标准1", Values = Enumerable.Range(0,5).Select(_ => rand.NextDouble()*20).ToList(), Stroke = Brushes.Blue },
|
|
new LineConfig { Title = "标准2", Values = Enumerable.Range(0,5).Select(_ => rand.NextDouble()*30).ToList(), Stroke = Brushes.Green },
|
|
new LineConfig { Title = "标准3", Values = Enumerable.Range(0,5).Select(_ => rand.NextDouble()*40).ToList(), Stroke = Brushes.Yellow }
|
|
|
|
};
|
|
|
|
// 更新图表(通过 Dispatcher 保证线程安全)
|
|
UpdateChart(chart, columnData, lineData);
|
|
|
|
await Task.Delay(5000); // 每秒更新一次
|
|
}
|
|
}, token);
|
|
}
|
|
}
|
|
}
|