图表自动滚动(示波器效果)

Den*_*ise 7 c# scroll mschart winforms

我的问题是,无论何时我向图表添加一个点,它都会压缩所有点.相反,我希望它自动滚动.

这里有两个.gif来解释我的问题

我现在有什么

在此输入图像描述

我想要实现的目标

在此输入图像描述

我现在的代码是

    DateTime dt;

    private void Form1_Load(object sender, EventArgs e)
    {
        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        dt = DateTime.Now;
        if (checkBox1.Checked)
        {
            chart1.Series["Light"].Points.AddXY(dt.ToShortTimeString(), 1);
        }
        else
        {
            chart1.Series["Light"].Points.AddXY(dt.ToShortTimeString(), 0);
        }

    }
Run Code Online (Sandbox Code Playgroud)

TaW*_*TaW 10

您可以选择以下选项:

  • 对于添加到右侧的每个点,您可以从左侧删除一个点(在一定数量之后)

  • 您可以移动x轴MinimumMaximum

  • 您可以将图表设置为缩放和平移,然后平移,即移动 ScaleView

第一个选项很简单,它将保持DataPoints的数量不变.根据您的需要,这可能是好的也可能是坏的.

另外两个将保留点的集合并且仅在图表中平移.

共同参考:

ChartArea ca = chart.ChartAreas[0];
Series s = chart.Series[0];
Run Code Online (Sandbox Code Playgroud)

这是第一个选项的代码:

s.Points.AddXY(..);
s.Points.RemoveAt(0);
ca.AxisX.Minimum = double.NaN;
ca.AxisX.Maximum = double.NaN;
ca.RecalculateAxesScale();
Run Code Online (Sandbox Code Playgroud)

这是选项2的代码:

int ix = s.Points.AddXY(..);

ca.AxisX.Maximum  = s.Points[ix].XValue;
ca.AxisX.Minimum += s.Points[ix].XValue - s.Points[ix-1].XValue;
ca.RecalculateAxesScale();
Run Code Online (Sandbox Code Playgroud)

这是选项3的代码:

int ix = s.Points.AddXY(..);
ca.AxisX.Minimum = double.NaN;
ca.AxisX.Maximum = double.NaN;
ca.RecalculateAxesScale();

ca.AxisX.ScaleView.Zoom(s.Points[ix-pointMax ].XValue, s.Points[ix].XValue );
Run Code Online (Sandbox Code Playgroud)

这假设pointMax系列中已有分数.

所有例子都假设你已经有几点了.选项1和3还假设既不Minimum也不Maximum的x轴被设置,即它们double.NaN.

最后一个选项可让您方便地滚动数据.

第一个保持数据点数低,但丢失除最后一点之外的所有数据点.

让我们看看工作中的所有选项:

在此输入图像描述

请注意,选项2和3也假设您具有有效的x值.如果不这样做,则需要对x轴进行索引并使用点索引而不是值.