using LiveCharts.Wpf;
using System.Windows.Media;
using System.Windows.Threading;
using WpfApp.src.config;
using WpfApp.Utils;
namespace WpfApp.Services
{
///
/// Chart 管理器 - 负责图表初始化和实时更新
///
public class ChartManager
{
private readonly Dispatcher dispatcher;
public ChartManager(Dispatcher uiDispatcher)
{
dispatcher = uiDispatcher;
}
///
/// 初始化图表
///
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 { 20, 10, 12, 5, 9 },
Labels = labels.ToList(),
LineConfigs = new List
{
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);
}
}
///
/// 动态更新图表数据(线程安全)
///
public void UpdateChart(CartesianChart chart, List columnData, List lineData)
{
dispatcher.Invoke(() =>
{
var config = new ChartConfig
{
ColumnData = columnData,
Labels = chart.AxisX[0].Labels.ToList(),
LineConfigs = lineData
};
InitChart.InitCartesianChart(chart, config);
});
}
///
/// 模拟后台数据采集并实时刷新图表
///
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
{
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);
}
}
}