LiveCharts在winform端使用的前提是需要在当前程序下通过nuget导入LiveCharts包,相应的会导入Livecharts.Winforms和LiveCharts.Wpf。这里就不在赘述,直接进入正题,如何生成动态变化曲线。
如上图,红色的点是我们设置的超过预设上限值的点,我们设置点为20.
我们先定义三个变量
public ChartValues<MeasureModel> ChartValues { get; set; }//用来作为图上显示的点集
public Timer Timer { get; set; }//定时器,用来作为更新图标动态生成用
public Random R { get; set; }//为了给Y值提供值
在当前图标窗体初始化下创建如下变量
var alarmBrush = new SolidColorBrush(Color.FromRgb(238, 83, 80));
var mapper = Mappers.Xy<MeasureModel>()
.X(model => model.DateTime.Ticks) //use DateTime.Ticks as X
.Y(model => model.Value)
.Fill(item => item.Value > 20 ? alarmBrush : null)
.Stroke(item => item.Value > 20 ? alarmBrush : null)
;
接着创建映射到全局和坐标轴的表示
//lets save the mapper globally.
Charting.For<MeasureModel>(mapper);
//the ChartValues property will store our values array
ChartValues = new ChartValues<MeasureModel>();
cartesianChart1.Series = new SeriesCollection
{
new LineSeries
{
//Configuration=mapper,
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();
最后就是
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, 30)
});
SetAxisLimits(now);
//lets only use the last 30 values
if (ChartValues.Count > 30) ChartValues.RemoveAt(0);
}
最后,欢迎关注我的公号,里面不定期分享PLC程序代码和学习知识等,欢迎互相交流学习。