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<MeasureModel>()
.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<MeasureModel>(mapper);
//the ChartValues property will store our values array
ChartValues = new ChartValues<MeasureModel>();
#region 添加两个实时曲线值
ChartValues2 = new ChartValues<MeasureModel>();
ChartValues3 = new ChartValues<MeasureModel>();
#endregion
//Servies 添加2个实时曲线
cartesianChart1.Series = new SeriesCollection
{
new LineSeries
{
Values = ChartValues,
PointGeometrySize = 18,
StrokeThickness = 4
},
new LineSeries
{
Values = ChartValues2,
PointGeometrySize = 18,
StrokeThickness = 4
},
new LineSeries
{
Values = ChartValues3,
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<MeasureModel> ChartValues { get; set; }
#region 添加2个实时曲线值
public ChartValues<MeasureModel> ChartValues2 { get; set; }
public ChartValues<MeasureModel> ChartValues3 { get; set; }
#endregion
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)
});
#region 修改添加两个实时曲线值
ChartValues2.Add(new MeasureModel
{
DateTime = now,
Value = R.Next(0, 10)
});
ChartValues3.Add(new MeasureModel
{
DateTime = now,
Value = R.Next(0, 10)
});
#endregion
SetAxisLimits(now);
//lets only use the last 30 values
if (ChartValues.Count > 30) ChartValues.RemoveAt(0);
}
}
}
添加效果图