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); } } }