winform的chart控件实现X轴以时间为刻度且随时间变化且可滚轮缩放
示意图
设置X轴以时间为刻度
代码
//显示格式为时:分:秒
AzTimeChart.ChartAreas[0].AxisX.Minimum = DateTime.Now.AddSeconds(-90).ToOADate(); // 设置X轴最小值和偏移量(这里是当前时间-90秒)
AzTimeChart.ChartAreas[0].AxisX.Maximum = DateTime.Now.AddSeconds(10).ToOADate(); // 设置X轴最大值和偏移量(这里是当前时间+10秒)
AzTimeChart.ChartAreas[0].AxisX.Interval = 5; // 设置X轴间隔(这里是5秒一个刻度)
AzTimeChart.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Seconds; // 设置间隔类型为秒
AzTimeChart.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss"; // 设置X轴标签显示的时间格式
AzTimeChart.Series[0].SmartLabelStyle.Enabled = true; // 这里是让标签根据密度转换风格
AzTimeChart.Series[0].XValueType = ChartValueType.DateTime; // 坐标轴type改为时间
// 刻度线显示
AzTimeChart.ChartAreas[0].AxisX.MajorGrid.Enabled = true;
AzTimeChart.ChartAreas[0].AxisX.MajorGrid.LineWidth = 1;
AzTimeChart.ChartAreas[0].AxisX.MajorGrid.LineColor = Color.LightGray;
添加节点
AzTimeChart.Series[0].Points.AddXY(DateTime, float); // 第一个参数直接用DateTime类型的数据就行
X轴随时间变化更新
首先需要在设计界面添加一个Timer控件,属性栏有个闪电图标,点进去就是控件的事件列表,你的Tick旁边应该是空的,双击添加就行
在事件处理函数添加如下代码,实现X轴随时间变化更新
AzTimeChart.ChartAreas[0].AxisX.Minimum = DateTime.Now.AddSeconds(-90).ToOADate(); // 设置X轴最小值和偏移量(这里是当前时间-90秒)
AzTimeChart.ChartAreas[0].AxisX.Maximum = DateTime.Now.AddSeconds(10).ToOADate(); // 设置X轴最大值和偏移量(这里是当前时间+10秒)
AzTimeChart.ChartAreas[0].AxisX.Interval = 5; // 设置X轴刻度间隔
AzTimeChart.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Seconds; // 设置间隔类型为秒
AzTimeChart.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss"; // 设置X轴标签格式
滚轮缩放图表
chart控件并不支持wheel(滚轮)事件,这里我用的是Form的wheel事件进行处理,也可以用panel控件的whell事件进行处理,方法一样,一会再说,先放代码
首先添加事件处理函数
// 处理鼠标滚轮事件
private void Form_MouseWheel(object sender, MouseEventArgs e)
{
// 检查滚轮方向
if (e.Delta > 0)
{
// 滚轮向上滚动,放大图表
ZoomIn(AzTimeChart.ChartAreas[0].AxisX);
}
else
{
// 滚轮向下滚动,缩小图表
ZoomOut(AzTimeChart.ChartAreas[0].AxisX);
}
}
然后在构造函数进行绑定
// 处理滚轮事件
this.MouseWheel += new MouseEventHandler(Form_MouseWheel);
接下来就是上滚和下滚的处理函数,这里是根据我的需求做的,你们根据实际情况来就行
// 滚轮向上滚动,放大图表
// 这里其实就是缩小了X轴的范围,间隔不变
private void ZoomIn(Axis axis)
{
if(_ATXMinNum < -10 || _ATXMaxNum > 1)
{
// _ATXMinNum和_ATXMaxNum 是定义了类的全局变量记录范围
// 因为我X轴的正数和负数的比例为9:1,所以每滚动一下它们都按比例减小
_ATXMinNum = _ATXMinNum - (int)(-10 * 0.9);
_ATXMaxNum = _ATXMaxNum - (int)(10 * 0.1);
AzTimeChart.ChartAreas[0].AxisX.Minimum = DateTime.Now.AddSeconds(_ATXMinNum).ToOADate(); // 设置X轴最小值(例如,过去一天)
AzTimeChart.ChartAreas[0].AxisX.Maximum = DateTime.Now.AddSeconds(_ATXMaxNum).ToOADate(); // 设置X轴最大值(例如,当前时间)
AzTimeChart.ChartAreas[0].AxisX.Interval = 5; // 设置X轴间隔(例如,每天一个刻度)
AzTimeChart.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Seconds; // 设置间隔类型为秒
AzTimeChart.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss"; // 设置X轴标签格式
}
}
// 滚轮向下滚动,缩小图表
// 和上面一样的道理
private void ZoomOut(Axis axis)
{
if (_ATXMinNum > -90 || _ATXMaxNum < 10)
{
_ATXMinNum = _ATXMinNum + (int)(-10 * 0.9);
_ATXMaxNum = _ATXMaxNum + (int)(10 * 0.1);
AzTimeChart.ChartAreas[0].AxisX.Minimum = DateTime.Now.AddSeconds(_ATXMinNum).ToOADate(); // 设置X轴最小值(例如,过去一天)
AzTimeChart.ChartAreas[0].AxisX.Maximum = DateTime.Now.AddSeconds(_ATXMaxNum).ToOADate(); // 设置X轴最大值(例如,当前时间)
AzTimeChart.ChartAreas[0].AxisX.Interval = 5; // 设置X轴间隔(例如,每天一个刻度)
AzTimeChart.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Seconds; // 设置间隔类型为秒
AzTimeChart.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss"; // 设置X轴标签格式
}
}
其实我计时器触发函数那里的最大最小值也用的_ATXMinNum和_ATXMaxNum,这样滚轮事件处理过X轴范围后计时器函数那里也同步上了