VisualStudio 2022を使って、C#(.NET Framework)でLiveCharts2により「RealTime Chart」を作成します。
アプリ作成の準備
C#(.NET Framework)がインストールされていない場合、デスクトップとモバイルから「Windows アプリケーション開発」を選択します
新規プロジェクトを作成するには、Windowsデスクトップのプロジェクトから「Windows フォームアプリケーション(.NET Framework)」を選択します。
LiveCharts2を使用するために、「ツール」メニュー→「NuGet パッケージ マネージャー」から順に「LiveChartsCore」「LiveChartsCore.SkiaSharpView」「LiveChartsCore.SkiaSharpView.WinForms」を選択してインストールします。
RealTime Chartアプリの作成
「LiveCharts2 gallery」のサンプルを参考にして、次のようにRealTime Chartアプリを作成します。
LiveCharts2Test\Form1.cs
using LiveCharts2Test.VM;
using LiveChartsCore.SkiaSharpView.Painting;
using LiveChartsCore.SkiaSharpView.WinForms;
using SkiaSharp;
using System.Drawing;
using System.Windows.Forms;
namespace LiveCharts2Test
{
public partial class Form1 : Form
{
private CartesianChart cartesianChart;
public Form1()
{
InitializeComponent();
InitializeRealTime();
}
private void InitializeRealTime()
{
Size = new System.Drawing.Size(1000, 1000);
var viewModel = new ViewModel_RealTime();
cartesianChart = new CartesianChart
{
SyncContext = viewModel.Sync,
Series = viewModel.Series,
XAxes = viewModel.XAxes,
// out of livecharts properties...
Location = new System.Drawing.Point(0, 0),
Size = new System.Drawing.Size(1000, 1000),
Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom
};
Controls.Add(cartesianChart);
}
}
}
LiveCharts2Test\ViewModel_RealTime.cs
using LiveChartsCore;
using LiveChartsCore.Defaults;
using LiveChartsCore.SkiaSharpView;
using LiveChartsCore.SkiaSharpView.Painting;
using SkiaSharp;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Threading.Tasks;
namespace LiveCharts2Test.VM
{
public partial class ViewModel_RealTime
{
private readonly Random _random = new Random();
private readonly List<DateTimePoint> _values = new List<DateTimePoint>();
private readonly DateTimeAxis _customAxis;
public ViewModel_RealTime()
{
Series = new ObservableCollection<ISeries>
{
new LineSeries<DateTimePoint>
{
Values = _values,
Fill = null,
GeometryFill = null,
GeometryStroke = null
}
};
_customAxis = new DateTimeAxis(TimeSpan.FromSeconds(1), Formatter)
{
CustomSeparators = GetSeparators(),
AnimationsSpeed = TimeSpan.FromMilliseconds(0),
SeparatorsPaint = new SolidColorPaint(SKColors.Black.WithAlpha(100))
};
XAxes = new Axis[] { _customAxis };
_ = ReadData();
}
public ObservableCollection<ISeries> Series { get; set; }
public Axis[] XAxes { get; set; }
public object Sync { get; } = new object();
public bool IsReading { get; set; } = true;
private async Task ReadData()
{
// to keep this sample simple, we run the next infinite loop
// in a real application you should stop the loop/task when the view is disposed
while (IsReading)
{
await Task.Delay(100);
// Because we are updating the chart from a different thread
// we need to use a lock to access the chart data.
// this is not necessary if your changes are made in the UI thread.
lock (Sync)
{
_values.Add(new DateTimePoint(DateTime.Now, _random.Next(0, 10)));
if (_values.Count > 250) _values.RemoveAt(0);
// we need to update the separators every time we add a new point
_customAxis.CustomSeparators = GetSeparators();
}
}
}
private double[] GetSeparators()
{
var now = DateTime.Now;
return new double[]
{
now.AddSeconds(-25).Ticks,
now.AddSeconds(-20).Ticks,
now.AddSeconds(-15).Ticks,
now.AddSeconds(-10).Ticks,
now.AddSeconds(-5).Ticks,
now.Ticks
};
}
private static string Formatter(DateTime date)
{
var secsAgo = (DateTime.Now - date).TotalSeconds;
return secsAgo < 1
? "now"
: $"{secsAgo:N0}s ago";
}
}
}
RealTime Chartアプリの実行
作成したRealTime Chartアプリを実行すると、次のようにランダムに発生したデータをグラフ化します。




