mirror of
https://gitee.com/akwkevin/aistudio.-wpf.-diagram
synced 2026-03-15 05:56:36 +08:00
项目结构调整
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
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>();
|
||||
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<MeasureModel> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user