Dynamic Line chart in C# WPF Application

前端 未结 1 527
鱼传尺愫
鱼传尺愫 2020-12-15 01:04

Im developing one GUI in C#.Net under WPF.Actually its an application for serial communication with the embedded device,I want to show a line chart with the frequently recie

相关标签:
1条回答
  • 2020-12-15 01:07

    I use Dynamic Data Display for all my WPF charting needs. It supports saving the charts, is very quick, provides seamless zooming and panning. Namespace: 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# Code: Converter used

    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# Code: Clearing Graph and Creating line graph, Here my StockasticProcessPoint is a structure with a field "DateTime t" and a field "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();
    }
    

    With this, you should be able to plot a chart in WPF. Adding data live when it comes back from the serial port should be no problem. You can also look at the binding examples from DynamicDataDisplay.

    0 讨论(0)
提交回复
热议问题