C# 通过添加图例将实时图表推离

C# 通过添加图例将实时图表推离,c#,winforms,charts,C#,Winforms,Charts,我在实时使用图表,通过单独的线程输入。但每次我添加另一个系列和传奇时,传奇会将图表推开,使其变小。我找不到任何解决办法 这是我在添加任何系列之前设置图表的功能: chart1.BackColor = Color.DarkGray; chart1.ForeColor = Color.White; chart1.ChartAreas[0].BackColor = Color.WhiteSmoke; chart1.ChartAreas[

我在实时使用图表,通过单独的线程输入。但每次我添加另一个系列和传奇时,传奇会将图表推开,使其变小。我找不到任何解决办法

这是我在添加任何系列之前设置图表的功能:

        chart1.BackColor = Color.DarkGray;
        chart1.ForeColor = Color.White;
        chart1.ChartAreas[0].BackColor = Color.WhiteSmoke;

        chart1.ChartAreas[0].AxisX.LabelStyle.ForeColor = Color.White;
        chart1.ChartAreas[0].AxisX.LineColor = Color.White;
        chart1.ChartAreas[0].AxisX.MajorGrid.LineColor = Color.DarkGray;
        chart1.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss";

        chart1.ChartAreas[0].AxisY.LabelStyle.ForeColor = Color.White;
        chart1.ChartAreas[0].AxisY.LineColor = Color.White;
        chart1.ChartAreas[0].AxisY.MajorGrid.LineColor = Color.DarkGray;

        chart1.ChartAreas[0].AxisX.Interval = 5;
        chart1.ChartAreas[0].AxisX.IntervalOffset = 1;

        chart1.ChartAreas[0].AxisX.IntervalType = System.Windows.Forms.DataVisualization.Charting.DateTimeIntervalType.Seconds;

        //SetX();
        DateTime act = DateTime.Now;
        DateTime max = act.AddSeconds(60);
        //DateTime min = act.AddSeconds(-30);

        chart1.ChartAreas[0].AxisX.Minimum = act.ToOADate();
        chart1.ChartAreas[0].AxisX.Maximum = max.ToOADate();
添加系列/点时:

        if (chart1.Legends.IndexOf(name) == -1)
        {
            //Legend
            chart1.Legends.Add(name);
            chart1.Legends[name].Docking = System.Windows.Forms.DataVisualization.Charting.Docking.Left;
            chart1.Legends[name].LegendStyle = System.Windows.Forms.DataVisualization.Charting.LegendStyle.Column;



        }

        // Must exists
        if (chart1.Series.IndexOf(name) == -1)
        {
            // Series
            chart1.Series.Add(name);
            chart1.Series[name].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.StepLine;
            chart1.Series[name].XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.DateTime;
            chart1.Series[name].BorderWidth = 4;
            chart1.Series[name].Legend = name;

        }


        DateTime act = DateTime.Now;

        //Get value from string
        switch (format)
        {
            case "BOOL":
                int boolval = value.ToUpper() == "TRUE" ? 1 : 0;
                chart1.Series[name].Points.AddXY(act, boolval);
                break;
            case "DEC":
                int intval = Int32.Parse(value);
                chart1.Series[name].Points.AddXY(act, intval);
                break;
            case "FLOAT":
                float fvalue = float.Parse(value);
                chart1.Series[name].Points.AddXY(act, fvalue);
                break;
        }

        if (act.ToOADate() >= chart1.ChartAreas[0].AxisX.Maximum)
        {
            SetX();
        }
没有这一行:

chart1.Series[name].Legend = name;
它似乎将所有图例连接到一个“DIV”中,但它始终以缩小图表的方式堆叠图例:

图为这一行


如何设置图例,使其不会更改图表的大小?

您需要控制
图表区域的位置和大小

这是通过将
位置
自动
设置为固定值来实现的

请注意,
ChartArea.Position
是一个

  • 保存矩形的所有四个元素,因此它不是一个位置,而是一个区域
  • 所有值均以周围元素的百分比表示,即图表的
    ClientRectangle
例如:

ChartArea ca = chart1.ChartAreas[0];
ca.Position = new ElementPosition(3, 13, 96, 84);
这将在所有侧面留下3%的填充,并将
图表区域下移10%

当您需要第二行
图例
LegendItems
时,您可能会想玩这些数字,并可能会调整它们

默认情况下,系统会向默认图例添加一个LegendItem。如果您想要更多的控制,您可以添加自定义LegendItems。有关这方面的更多信息,请参阅


默认情况下,系统将调整
图表区域的位置,使其与默认的
图例
完美匹配。看起来您做的比代码中显示的要多一些。

您可以控制图表区域的元素位置,使其位于图例行下方。但是,为什么要添加任何图例??只需要一个图例和几个LegendItems,甚至默认图例都提供了。你可以发布一些示例吗?“看起来你把事情搞砸了?”不,我没有。好吧,无意冒犯,但你一定做了比你展示的代码更多的事。你试过我的建议了吗?我已经为图表和图例定义了区域。传奇人物现在很好地占据了他们的地盘。我还在测试它。