C# 如何在Windows窗体中使用Oxyplot更新绘图

C# 如何在Windows窗体中使用Oxyplot更新绘图,c#,oxyplot,C#,Oxyplot,我正在做一个项目,我从一块电路板上读取一些串行数据,并试图将其显示在一个图表上。 到目前为止,我已经成功地在我的应用程序中实现了Oxyplot 但我不知道如何更新来自串行端口的每个新数据的绘图 这是我的简化版代码 using OxyPlot; namespace Motor { public partial class Form1 : Form { public Form1() { InitializeComponent(); ComP

我正在做一个项目,我从一块电路板上读取一些串行数据,并试图将其显示在一个图表上。 到目前为止,我已经成功地在我的应用程序中实现了Oxyplot

但我不知道如何更新来自串行端口的每个新数据的绘图

这是我的简化版代码

using OxyPlot;


namespace Motor
{

public partial class Form1 : Form
{ 


    public Form1()
    {
        InitializeComponent();
        ComPort.DataReceived += new 
            System.IO.Ports.SerialDataReceivedEventHandler(port_DataReceived_1);
        plot1.Model = GridLinesHorizontal();

    }

    public static PlotModel GridLinesHorizontal()
    {
        var plotModel = new PlotModel();
        plotModel.Title = "Horizontal";
        var linearAxis1 = new LinearAxis();

        linearAxis1.MajorGridlineStyle = LineStyle.Solid;
        linearAxis1.MinorGridlineStyle = LineStyle.Dot;
        linearAxis1.Maximum = 5;
        linearAxis1.Minimum = -5;
        plotModel.Axes.Add(linearAxis1);

        return plotModel;

    }


    private void port_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
    {

        InputData = ComPort.ReadLine();

        if (InputData != String.Empty)
        {
            this.BeginInvoke(new SetTextCallback(SetText), new object[] { InputData });
        }
    }

    private void SetText(string text)
    {
        dVal = double.Parse(text, CultureInfo.InvariantCulture); // convert to double
        ///// HERE I WANT TO UPDATE THE PLOT with dval
    }

}
}

不确定这是否是最好的方法,但类似的方法应该有效:

using OxyPlot;
using OxyPlot.Axes;
using OxyPlot.Series;

namespace Motor
{
    public partial class Form1 : Form
    { 
        public Form1()
        {
           InitializeComponent();
           ComPort.DataReceived += new
                  System.IO.Ports.SerialDataReceivedEventHandler(port_DataReceived_1);
           plot1.Model = GridLinesHorizontal();
           //create new LineSeries and add it to the PlotView
           Line1 = new LineSeries
           {
               Title = "Test Series",
               Color = OxyColors.Red,
               TextColor = OxyColors.Red,
               BrokenLineColor = OxyColors.Red
           };
           plot1.Model.Series.Add(Line1);

       }

       LineSeries Line1; // declare Line1 as global

       public static PlotModel GridLinesHorizontal()
       {
           var plotModel = new PlotModel();
           plotModel.Title = "Horizontal";
           var linearAxis1 = new LinearAxis();

           linearAxis1.MajorGridlineStyle = LineStyle.Solid;
           linearAxis1.MinorGridlineStyle = LineStyle.Dot;
           linearAxis1.Maximum = 5;
           linearAxis1.Minimum = -5;
           plotModel.Axes.Add(linearAxis1);

           return plotModel;

       }

       private void port_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
       {
           InputData = ComPort.ReadLine();

           if (InputData != String.Empty)
           {
               this.BeginInvoke(new SetTextCallback(SetText), new object[] { InputData });
           }
       }
       int plotIndex = 0;
       private void SetText(string text)
       {
           dVal = double.Parse(text, CultureInfo.InvariantCulture); // convert to double
           ///// plotIndex is the x value of the new point, not sure if OxyPlot offers an auto increment option
           Line1.Points.Add(new DataPoint(plotIndex, dVal));
           plotIndex++;
           plot1.Invalidate();
       }
    }
}

谢谢分享,我会试试你的建议,关于plotindex,我猜你指的是x轴。好的,将来我计划用定时器或类似的东西来增加它。现在只想熟悉oxyYes,plotIndex是x轴上的新点位置。这样,它会自动将每个新数据值移动到旧数据值的右侧。您还可以使用plotIndex变量设置x轴的视图范围,以便它始终显示最新数据。谢谢,它现在运行良好,同时我注意到oxyplot有一些不同的版本。是否有可能使图表集中在新数据上,并以1毫秒为基准?