如何快速向 WPF 图表添加数据点
问题出现的原因是在WPF图表中添加数据点时速度较慢。解决方法是考虑使用第三方组件供应商的DevExpress ChartControl。
DevExpress ChartControl是一个适合线状图表的第三方组件。最新版本的DevExpress组件中包含一个名为"Large Datasource"的演示模块,可以展示多达500K个数据点而不会出现严重的性能下降(包括滚动和缩放等交互操作)。
使用DevExpress ChartControl可以解决WPF图表中添加数据点速度较慢的问题。以下是一个示例代码:
// 创建一个ChartControl实例
ChartControl chartControl = new ChartControl();
// 设置数据源
chartControl.DataSource = yourDataSource;
// 添加线状图
Series series = new Series();
series.View = new LineSeriesView();
chartControl.Series.Add(series);
// 添加数据点
foreach (DataPoint dataPoint in yourDataPoints)
{
series.Points.Add(dataPoint);
}
// 显示图表
chartControl.Show();
通过使用DevExpress ChartControl,您可以快速地向WPF图表中添加数据点,而不会影响性能。这使得展示大量数据点成为可能,同时保持流畅的用户体验。
这篇文章探讨了在WPF中快速添加数据点到图表的问题。问题的出现原因是WPF库在处理大量数据点时效果不佳,无法满足需求。虽然可以尝试使用数据采样等解决方案,但效果并不理想。作者推荐使用第三方WPF图表库Scichart,该库具有出色的性能和可定制性,并且支持2D和3D图表,可以轻松添加大量数据点。
对于解决这个问题,作者建议尝试Scichart图表库。Scichart具有出色的渲染性能、完整的MVVM支持以及详细的文档和支持论坛,用户可以通过绑定或直接添加数组方式将数据集添加到图表中,并可以在毫秒内渲染出来。另外,Scichart还提供免费试用许可证,用户可以先试用一下。
还有其他的图表库,如DevExpress和Arction的lightningchart库。作者认为DevExpress适合处理少量数据点的仪表盘图表,而Arction库的样式和MVVM能力较差,并且文档和支持论坛都相对较少。
最后,作者强调了Scichart的价值和性能,尤其是在处理大数据集时。虽然Scichart的价格较高,但对于其提供的功能和性能来说,这个价格是合理的。
总之,这篇文章介绍了在WPF中快速添加数据点到图表的问题,并推荐了使用Scichart图表库作为解决方案。作者通过自己的经验和对其他图表库的比较,强调了Scichart在WPF领域中的优越性。
如何快速向WPF图表添加数据点
慢的图表主要是由于在将数据点逐个添加到视图模型集合时生成的所有事件造成的。将它们一次性添加解决了这个问题:
扩展ObservableCollection以支持AddRange,如下所示:
public class ObservableCollectionRange: ObservableCollection { public void AddRange(IEnumerable items) { this.CheckReentrancy(); foreach (var item in items) this.Items.Add(item); this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } }
然后在视图模型中使用它:
public class MyViewModel { public ObservableCollectionRange> Power { get; set; } public ObservableCollectionRange > PowerAvg { get; set; } public MyViewModel() { Power = new ObservableCollectionRange >(); PowerAvg = new ObservableCollectionRange >(); } public void Add(double x, double y) { Power.Add(new KeyValuePair (x, y)); double xmin = Power.Min(kvp => kvp.Key); double xmax = Power.Max(kvp => kvp.Key); double ymin = Power.Min(kvp => kvp.Value); double ymax = Power.Max(kvp => kvp.Value); double yavg = Power.Average(kvp => kvp.Value); PowerAvg.Clear(); PowerAvg.Add(new KeyValuePair (xmin, yavg)); PowerAvg.Add(new KeyValuePair (xmax, yavg)); } public void AddRange(IEnumerable > items) { Power.AddRange(items); double xmin = Power.Min(kvp => kvp.Key); double xmax = Power.Max(kvp => kvp.Key); double ymin = Power.Min(kvp => kvp.Value); double ymax = Power.Max(kvp => kvp.Value); double yavg = Power.Average(kvp => kvp.Value); PowerAvg.Clear(); PowerAvg.Add(new KeyValuePair (xmin, yavg)); PowerAvg.Add(new KeyValuePair (xmax, yavg)); } }
在按钮点击事件中:
private void Button_Click(object sender, RoutedEventArgs e) { ShowPoints(); } private void ShowPoints() { Random random = new Random(); ObservableCollection> oc = new ObservableCollection >(); for (int i = 1; i <= 1500; i++) oc.Add(new KeyValuePair (i, random.NextDouble())); vm.AddRange(oc); }
问题的原因是逐个添加数据点时生成的事件导致图表变慢。通过一次性添加所有数据点来解决这个问题。解决方法是扩展ObservableCollection类,添加AddRange方法,然后在视图模型中使用它来一次性添加数据点。