using System; using System.Windows.Forms; using LiveCharts; using LiveCharts.Configurations; using LiveCharts.Wpf; namespace Winforms.Cartesian.ConstantChanges { public partial class ConstantChanges : Form { public ConstantChanges() { InitializeComponent(); //To handle live data easily, in this case we built a specialized type //the MeasureModel class, it only contains 2 properties //DateTime and Value //We need to configure LiveCharts to handle MeasureModel class //The next code configures MEasureModel globally, this means //that livecharts learns to plot MeasureModel and will use this config every time //a ChartValues instance uses this type. //this code ideally should only run once, when application starts is reccomended. //you can configure series in many ways, learn more at http://lvcharts.net/App/examples/v1/wpf/Types%20and%20Configuration var mapper = Mappers.Xy() .X(model => model.DateTime.Ticks) //use DateTime.Ticks as X .Y(model => model.Value); //use the value property as Y //lets save the mapper globally. Charting.For(mapper); //the ChartValues property will store our values array ChartValues = new ChartValues(); cartesianChart1.Series = new SeriesCollection { new LineSeries { Values = ChartValues, PointGeometrySize = 18, StrokeThickness = 4 } }; cartesianChart1.AxisX.Add(new Axis { DisableAnimations = true, LabelFormatter = value => new System.DateTime((long) value).ToString("mm:ss"), Separator = new Separator { Step = TimeSpan.FromSeconds(1).Ticks } }); SetAxisLimits(System.DateTime.Now); //The next code simulates data changes every 500 ms Timer = new Timer { Interval = 500 }; Timer.Tick += TimerOnTick; R = new Random(); Timer.Start(); } public ChartValues ChartValues { get; set; } public Timer Timer { get; set; } public Random R { get; set; } private void SetAxisLimits(System.DateTime now) { cartesianChart1.AxisX[0].MaxValue = now.Ticks + TimeSpan.FromSeconds(1).Ticks; // lets force the axis to be 100ms ahead cartesianChart1.AxisX[0].MinValue = now.Ticks - TimeSpan.FromSeconds(8).Ticks; //we only care about the last 8 seconds } private void TimerOnTick(object sender, EventArgs eventArgs) { var now = System.DateTime.Now; ChartValues.Add(new MeasureModel { DateTime = now, Value = R.Next(0, 10) }); SetAxisLimits(now); //lets only use the last 30 values if (ChartValues.Count > 30) ChartValues.RemoveAt(0); } } }