使用该控件进行绘图的一些基本内容,可以直接用,很多是网上收集的,后续有功能完善再修改;农历2023年最后一天了!春节快乐!
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
namespace WfmThreadUpUIAndCharttest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Thread ThreadLoopUpdata = null;
Random MyRandom = new Random();
System.Timers.Timer sysTimer = new System.Timers.Timer();
List<int> xValue = new List<int>();
List<int> y1Value = new List<int>();
List<int> y2Value = new List<int>();
List<int> y3Value = new List<int>();
private void btStart_Click(object sender, EventArgs e)
{
xValue.Clear();
y1Value.Clear();
y2Value.Clear();
y3Value.Clear();
if (ThreadLoopUpdata != null)
{
ThreadLoopUpdata.Abort();
ThreadLoopUpdata = null;
}
ThreadLoopUpdata = new Thread(LoopUpdataBoxText);
ThreadLoopUpdata.Start();
}
private void LoopUpdataBoxText()
{
int idx = 0;
while (true)
{
xValue.Add(idx);
y1Value.Add(MyRandom.Next(0, 30));
y2Value.Add(MyRandom.Next(35, 75));
y3Value.Add(MyRandom.Next(70, 100));
//this.Invoke(new Action(() => {
// tbShow.Text = MyRandom.Next().ToString();
//}));
//if (tbShow.InvokeRequired)
//{
// // 使用Invoke在UI线程上执行更新
// tbShow.Invoke(new Action(() =>
// {
// tbShow.Text = MyRandom.Next().ToString();
// }));
//}
//else
//{
// // 直接更新TextBox,因为它已经在UI线程上
// tbShow.Text = MyRandom.Next().ToString();
//}
// 使用Invoke在UI线程上执行更新
tbShow.Invoke(new Action(() =>
{
tbShow.Text = MyRandom.Next().ToString();
}));
if (idx > 100)
{
ThreadLoopUpdata.Abort();
break;
}
Console.WriteLine(idx);
idx++;
Thread.Sleep(50);
}
}
private void button1_Click(object sender, EventArgs e)
{
btStart_Click(sender, e);
sysTimer.Interval = 100;
sysTimer.Elapsed += SysTimerElapsed;
chart1.Series[0].Points.Clear();
sysTimer.Start();
}
int idx = 0;
private void SysTimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//int yVlaue = MyRandom.Next(1, 100);
this.Invoke(new Action(() => {
//chart1.Series[0].Points.AddXY(idx, yVlaue);
chart1.Series[0].Points.DataBindXY(xValue, y1Value);
chart1.Series[1].Points.DataBindXY(xValue, y2Value);
chart1.Series[2].Points.DataBindXY(xValue, y3Value);
}));
//idx++;
}
public static async void callMethod()
{
//Task<int> task = Method1();
//Method2();
//int count = await task;
//Method3(count);
await Task.Run(() => {
for(int i = 0; i < 10; i++)
{
Thread.Sleep(500);
Console.WriteLine("task run");
}
});
await Method4();
}
public static async Task<int > Method4()
{
int ret = await Task<int>.Run(() => {
for (int i = 0; i < 15; i++)
{
Console.WriteLine(" Method4");
Thread.Sleep(200);
}
return 1000;
});
return ret;
}
public static async Task Method5()
{
await Task.Run(() => {
for (int i = 0; i < 15; i++)
{
Console.WriteLine(" Method4");
Thread.Sleep(200);
}
});
}
public static async Task<int> Method1()
{
int count = 0;
await Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(" Method 1");
count += 1;
Thread.Sleep(200);
}
});
return count;
}
public static void Method2()
{
for (int i = 0; i < 15; i++)
{
Console.WriteLine(" Method 2");
Thread.Sleep(200);
}
}
public static void Method3(int count)
{
Console.WriteLine("Total count is " + count);
}
private void timer1_Tick(object sender, EventArgs e)
{
}
private void Form1_Load(object sender, EventArgs e)
{
ChartInit(chart1);
}
private void ChartInit(Chart chart)
{
//设置 包括的数据
//chart.Series[0].Name = "Data1";
chart.Series.Clear();
chart.Series.Add("Data1");
chart.Series.Add("Data2");
chart.Series.Add("Data3");
//设置坐标轴
chart.ChartAreas[0].AxisX.Title = "序号";
chart.ChartAreas[0].AxisX.TitleAlignment = StringAlignment.Center;//设置居中显示
chart.ChartAreas[0].AxisX.MajorGrid.Enabled = true; //主的竖格子是否显示
chart.ChartAreas[0].AxisX.Interval = 5;//设置间隔
chart.ChartAreas[0].AxisX.Minimum = 0;
chart.ChartAreas[0].AxisX.Maximum = 100;
chart.ChartAreas[0].AxisX.ScrollBar.Enabled = true;//是否支持滚动条
chart.ChartAreas[0].AxisY.Title = "数值";
chart.ChartAreas[0].AxisY.TitleAlignment = StringAlignment.Center;
chart.ChartAreas[0].AxisY.TextOrientation = TextOrientation.Auto;//文字方向
chart.ChartAreas[0].AxisY.Interval = 10;
chart.ChartAreas[0].AxisY.MajorGrid.Enabled = true;
chart.ChartAreas[0].AxisY.Minimum = 0;
chart.ChartAreas[0].AxisY.Maximum = 100;
//设置绘图的类型
chart.Series["Data1"].ChartType = SeriesChartType.Spline;
//chart.Series[0].ChartType = SeriesChartType.Spline;
chart.Series[1].ChartType = SeriesChartType.Spline;
chart.Series[2].ChartType = SeriesChartType.Line;
chart.Series[0].XValueType = ChartValueType.Auto;//x坐标的 类型
//chart.Series[0].IsValueShownAsLabel = true;// 是否显示数据
//chart.ChartAreas[0].AxisX.ScaleView.Size = 1;
//实现对选中区域进行缩放
chart.ChartAreas[0].CursorX.Interval = 0;
chart.ChartAreas[0].CursorX.IsUserEnabled = true;
chart.ChartAreas[0].CursorX.IsUserSelectionEnabled = true;
//鼠标滚动事件
chart.MouseWheel += ChartMouseWheel;
chart.MouseClick += ChartMouseClick;//左键显示数值,右键放大缩小回复
}
ToolTip toolTip = new ToolTip();
private void ChartMouseClick(object sender, MouseEventArgs e)
{
Chart chart = sender as Chart;
if (e.Button == MouseButtons.Left)
{
var area = chart.ChartAreas[0];
double xvalue = area.AxisX.PixelPositionToValue(e.X);
double yvalue = area.AxisY.PixelPositionToValue(e.Y);
toolTip.Show($"角度:{xvalue},幅值:{yvalue}", chart);
}
else if (e.Button == MouseButtons.Right)
{
chart.ChartAreas[0].AxisX.ScaleView.ZoomReset(0);
}
}
private void ChartMouseWheel(object sender, MouseEventArgs e)
{
Chart chart = sender as Chart;
if (e.Delta == 120)
{
if (chart.ChartAreas[0].AxisX.ScaleView.Size > 0)
{
chart.ChartAreas[0].AxisX.ScaleView.Size /= 2;//x轴 显示的数据是原来的一半,相当于放大了
}
else
{
chart.ChartAreas[0].AxisX.ScaleView.Size = chart.ChartAreas[0].AxisX.Maximum - chart.ChartAreas[0].AxisX.Minimum; //首次旋转时 size为空,先赋值
}
}
else if (e.Delta == -120)
{
if (chart.ChartAreas[0].AxisX.ScaleView.Size > 0)
{
chart.ChartAreas[0].AxisX.ScaleView.Size *= 2;//x轴 显示的数据是原来的两倍,相当于缩小了
}
else
{
chart.ChartAreas[0].AxisX.ScaleView.Size = chart.ChartAreas[0].AxisX.Maximum - chart.ChartAreas[0].AxisX.Minimum; //首次旋转时 size为空,先赋值
}
}
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
Chart chart = chart1 as Chart;
if (checkBox1.Checked)
{
chart.Series[0].Enabled = true;
}
else {
chart.Series[0].Enabled = false;
}
}
private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
Chart chart = chart1 as Chart;
if (checkBox2.Checked)
{
chart.Series[1].Enabled = true;
}
else
{
chart.Series[1].Enabled = false;
}
}
private void checkBox3_CheckedChanged(object sender, EventArgs e)
{
Chart chart = chart1 as Chart;
if (checkBox3.Checked)
{
chart.Series[2].Enabled = true;
}
else
{
chart.Series[2].Enabled = false;
}
}
private void cbShowData_CheckedChanged(object sender, EventArgs e)
{
Chart chart = chart1 as Chart;
if (cbShowData.Checked)
{
chart.Series[0].IsValueShownAsLabel = true;// 是否显示数据
chart.Series[1].IsValueShownAsLabel = true;// 是否显示数据
chart.Series[2].IsValueShownAsLabel = true;// 是否显示数据
}
else
{
chart.Series[0].IsValueShownAsLabel = false;// 是否显示数据
chart.Series[1].IsValueShownAsLabel = false;// 是否显示数据
chart.Series[2].IsValueShownAsLabel = false;// 是否显示数据
}
}
}
}