2011-08-17 27 views
6

C#.NetのWPFで実際に1つのGUIを開発しています。実際には埋め込みデバイスとのシリアル通信アプリケーションです。頻繁に受信したデータを折れ線グラフで表示します。それらのチャートを保存し、それを印刷するオプションを与えるオプションを提供しています。無料のライブラリやソフトウェアのサポートを使って動的にこれを描くことはできますか?C#WPFアプリケーションの動的折れ線グラフ

答えて

9

私はすべてのWPFチャート作成のニーズにDynamic Data Displayを使用します。これは、グラフの保存をサポートし、非常に迅速で、シームレスなズームとパンを提供します。 名前空間:の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のバインディングの例を見ることもできます。

+0

ライブラリファイルをプロジェクトに追加するにはどうすればいいですか。すべての.dllファイルを追加する必要があるかどうかにかかわらずダウンロードしました。 – Mukthi

+0

Visual Studioのプロジェクトの参照フォルダ - >参照の追加を行います。 DynamicDataDisplay.dllをプロジェクトに追加します。他の外部参照と同じです。 – NetSquirrel

+2

ソースコードとナゲットのインストールについては、https://github.com/apoydence/DynamicDataDisplayとhttps://www.nuget.org/packages/DynamicDataDisplay/をご覧ください。 – Andrew

関連する問題