2011-08-17 12 views
6

Estoy desarrollando una GUI en C# .Net bajo WPF. De hecho, es una aplicación para la comunicación serial con el dispositivo integrado, quiero mostrar un gráfico de líneas con los datos recibidos frecuentemente. Y también debería proporcione una opción para guardar esos cuadros y dar una opción para imprimirlos. ¿Cómo puedo dibujar esto dinámicamente con el soporte de librerías o software gratuitos?Gráfico de líneas dinámicas en C# Aplicación WPF

Respuesta

9

Uso Dynamic Data Display para todas mis necesidades de gráficos WPF. Es compatible con guardar los gráficos, es muy rápido, proporciona un acercamiento y paneo sin interrupciones. Espacio de nombres: 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# Código: convertidor utilizado

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# Código: Borrar gráfico y Crear gráfico de línea, aquí mi StockasticProcessPoint es una estructura con un campo "DateTime t" y un campo "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(); 
} 

Con esto, debería ser capaz de trazar un gráfico en WPF. Agregar datos en vivo cuando vuelve desde el puerto serie no debería ser un problema. También puede ver los ejemplos vinculantes de DynamicDataDisplay.

+0

¿Cómo puedo agregar los archivos de biblioteca a mi proyecto? Lo descargué si tengo que agregar todos los archivos .dll – Mukthi

+0

Lo hace en Visual Studio, en la carpeta Referencias del proyecto -> Agregar referencia. Agregue DynamicDataDisplay.dll a su proyecto. Igual que cualquier otra referencia externa. – NetSquirrel

+2

Consulte: https://github.com/apoydence/DynamicDataDisplay y https://www.nuget.org/packages/DynamicDataDisplay/ para ver el código fuente y la instalación nuget. – Andrew

Cuestiones relacionadas