如何在Winforms C#中绘制图表上的点和线

qnakjoqk  于 7个月前  发布在  C#
关注(0)|答案(1)|浏览(88)

我需要做一个程序,用Winforms在笛卡尔平面上画一条线。我的数据输入方法是在标记为XYTextBox控件中输入坐标,但我的问题一般是关于在图表上表示点并连接它们来画一条线。


的数据

ee7vknir

ee7vknir1#

使用System.Windows.Forms.DataVisualization.Charting是实现这一点的一种方法,我使用过它的产品代码,发现它功能丰富且健壮。
对于**.Net Core**,请将System.Windows.Forms.DataVisualization安装为NuGet预发布版本(与System.Data.SqlClient沿着作为依赖项)* 或 * 移植它的第三方衍生产品之一。* 在搜索NuGets时,确保选中了**[x] Include Prerelease框。* 我使用.Net Core 3和. Net Core 4测试了这个答案(clone)和.Net Core 6(clone)。如果您仍在使用.NET Framework**,则它已经内置,不需要外部包。(我已经 * 经常 * 使用该版本。)
我已经整理了一个图表的基本示例,该示例在每次单击鼠标时在十字线处添加一个点,双击鼠标时清除所有点。要回答您提出的问题,即如何使用文本框绘制线条,只需查看将点添加到系列中的代码,并使用文本框中的值执行相同的操作。
x1c 0d1x的数据

主表单CTOR

Panel已放置在MainForm上,以包含在MainForm CTor中设置的ChartCrossing属性设置为0,以便X-Y居中。IsMarksNextToAxis属性设置为false以将标签放在两侧和底部。将这些属性设置为true将使其看起来更像您的邮报

public MainForm()
{
    InitializeComponent();
    _chart = new Chart{ Dock = DockStyle.Fill, };
    _series = new Series
    {
        Name = "Series1",
        Color = Color.Green,
        IsVisibleInLegend = false,
        IsXValueIndexed = false,
        ChartType = SeriesChartType.Line,
        BorderWidth = 2, // In a line chart, this is the width of the line.
    };
    _series.Points.Add(new DataPoint { IsEmpty = true });

    _chartArea = new ChartArea
    {
        AxisX =
        {
            Minimum = -10,
            Maximum = 10,
            Interval = 1,
            IsMarksNextToAxis = false,
            IsLabelAutoFit = false,
            Crossing = 0,
            LineWidth = 1,
            MajorGrid = {  Interval = 1, LineColor = Color.LightBlue, LineWidth = 1 },
            Enabled = AxisEnabled.True,
        },
        AxisY =
        {
            Minimum = -10,
            Maximum = 10,
            Interval = 1,
            IsMarksNextToAxis = false,
            IsLabelAutoFit = false,
            Crossing = 0,
            LineWidth = 1,
            MajorGrid = {  Interval = 1, LineColor = Color.LightBlue, LineWidth = 1 },
            Enabled = AxisEnabled.True,
        },
    };

    _chart.ChartAreas.Add(_chartArea);
    _series.MarkerStyle = MarkerStyle.Cross;
    _chart.Series.Add(_series);

    _chartArea.CursorX.LineColor = Color.LightCoral;
    _chartArea.CursorX.Interval = 0.01;
    _chartArea.CursorX.IsUserEnabled = true;

    _chartArea.CursorY.LineColor = Color.LightCoral;
    _chartArea.CursorY.Interval = 0.01;
    _chartArea.CursorY.IsUserEnabled = true;

    panel.Controls.Add(_chart);
    #if false
    // Draw diagonal
    for (int i = -10; i <= 10; i++)
    {
        _series.Points.AddXY(i, i);
    }
    #endif
    _chart.MouseClick += onChartClick;
    _chart.MouseDoubleClick += onChartDoubleClick;
    _chart.MouseMove += onChartMouseMove;
}

字符串

事件

使用光标位置将新点添加到系列中。

private void onChartClick(object sender, MouseEventArgs e)
{
    _series.Points.AddXY(_chartArea.CursorX.Position, _chartArea.CursorY.Position);
}


按两下即可清除数列。

private void onChartDoubleClick(object sender, MouseEventArgs e)
{
    _series.Points.Clear();
    _series.Points.Add(new DataPoint { IsEmpty = true });
}


移动十字光标:

private void onChartMouseMove(object sender, MouseEventArgs e)
{
    _chartArea.CursorX.SetCursorPixelPosition(e.Location, true);
    _chartArea.CursorY.SetCursorPixelPosition(e.Location, true);
}

核武器


相关问题