gpt4 book ai didi

c# - C# WPF 应用程序中的动态折线图

转载 作者:太空狗 更新时间:2023-10-29 20:11:23 39 4
gpt4 key购买 nike

我在 WPF 下用 C#.Net 开发一个 GUI。实际上它是一个与嵌入式设备进行串行通信的应用程序,我想显示一个包含经常收到的数据的折线图。我还应该提供一个选项来保存这些图表并提供打印它的选项。如何在免费库或软件的支持下动态绘制它?

最佳答案

我使用 Dynamic Data Display满足我所有的 WPF 图表需求。它支持保存图表,速度非常快,提供无缝缩放和平移。命名空间:xmlns:d3="http://research.microsoft.com/DynamicDataDisplay/1.0"

XAML:

 <d3:ChartPlotter Name="plotter" Background="White">
<d3:ChartPlotter.Resources>
<conv:Date2AxisConverter x:Key="Date2AxisConverter"/>
</d3:ChartPlotter.Resources>
<d3:ChartPlotter.HorizontalAxis>
<d3:HorizontalDateTimeAxis Name="dateAxis"/>
</d3:ChartPlotter.HorizontalAxis>
<d3:Header Content="{Binding PlotHeader}"/>
<d3:VerticalAxisTitle Content="Value"/>
<d3:HorizontalAxisTitle Content="Date"/>
</d3:ChartPlotter>

C#代码:使用转换器

public class Date2AxisConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is DateTime && targetType == typeof(double))
{
return ((DateTime)value).Ticks / 10000000000.0;
// See constructor of class Microsoft.Research.DynamicDataDisplay.Charts.DateTimeAxis
// File: DynamicDataDisplay.Charts.Axes.DateTime.DateTimeAxis.cs

// alternatively, see the internal class Microsoft.Research.DynamicDataDisplay.Charts.DateTimeToDoubleConversion

}
return null;
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
// try Microsoft.Research.DynamicDataDisplay.Charts.DateTimeAxis.DoubleToDate
throw new NotSupportedException();
}

#endregion
}

C# 代码:清除图形和创建折线图,这里我的 StockasticProcessPoint 是一个包含字段“DateTime t”和字段“Double value”的结构。

using Microsoft.Research.DynamicDataDisplay;
using System.Collections.ObjectModel;
using Microsoft.Research.DynamicDataDisplay.DataSources;

public void ClearLines()
{
var lgc = new Collection<IPlotterElement>();
foreach (var x in plotter.Children)
{
if (x is LineGraph || x is ElementMarkerPointsGraph)
lgc.Add(x);
}

foreach (var x in lgc)
{
plotter.Children.Remove(x);
}
}

internal void SendToGraph() {

IPointDataSource _eds = null;
LineGraph line;

ClearLines();

EnumerableDataSource<StochasticProcessPoint> _edsSPP;
_edsSPP = new EnumerableDataSource<StochasticProcessPoint>(myListOfStochasticProcessPoints);
_edsSPP.SetXMapping(p => dateAxis.ConvertToDouble(p.t));
_edsSPP.SetYMapping(p => p.value);
_eds = _edsSPP;

line = new LineGraph(_eds);
line.LinePen = new Pen(Brushes.Black, 2);
line.Description = new PenDescription(Description);
plotter.Children.Add(line);
plotter.FitToView();
}

有了这个,您应该能够在 WPF 中绘制图表。从串口返回时实时添加数据应该没问题。您还可以查看 DynamicDataDisplay 中的绑定(bind)示例。

关于c# - C# WPF 应用程序中的动态折线图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7090345/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com