×

别小看 WinForm!一个高颜值工业级仪表盘的完整实现

独孤求败 独孤求败 发表于2026-02-11 10:38:34 浏览13 评论0

抢沙发发表评论

前言

工业监控、设备状态展示或数据仪表盘开发中,直观的可视化控件往往比枯燥的数字更有效。尤其是在 Windows 桌面应用领域,WinForm 虽然"年长",但凭借其稳定性和低资源占用,仍在许多系统中占据重要地位。

本文将介绍一款基于 WinForm 的表盘式仪表组件,通过 AGauge 控件与 Chart 图表,实现了一个兼具美观性与实用性的数据展示界面。

项目介绍

该项目是一个典型的 WinForm 桌面程序,核心目标是通过图形化方式动态呈现数值变化。

主窗体包含一个圆形表盘(使用第三方 AGauge 控件)和一个图表区域(使用 .NET 自带的 Chart 控件)。可通过滑动条实时调整表盘指针值,系统会同步更新表盘标签、颜色反馈,并在图表中展示预设的历史数据趋势。整个设计简洁清晰,适用于设备监控、性能指标展示等场景。

项目功能

  • 表盘数值可由 TrackBar 滑块实时控制,范围灵活设定。

  • 表盘中央显示当前数值,随指针变化自动刷新。

  • 支持"告警区间"设置:当数值进入预设范围(如 40–60),背景面板自动变红,退出后恢复默认色。

  • 可通过按钮动态添加新的告警区间,增强交互灵活性。

  • 图表区域展示一组年度数据(如 2011–2016 年的指标值),每个数据点采用不同颜色突出显示。

  • 图表支持多种样式配置,包括折线、柱状、饼图等(代码中以柱状/折线为主),并可自定义标记点、网格线、标签格式等。

项目特点

1、轻量实用:不依赖大型框架,仅用 .NET Framework 内置组件和轻量级 AGauge 库,部署简单。

2、响应及时:数值变更事件驱动界面更新,无延迟感。

3、视觉反馈明确:通过颜色变化(如面板变红)直观提示异常状态。

4、易于扩展:代码结构清晰,新增数据源、修改告警逻辑或切换图表类型都较为方便。

5、适合嵌入:可作为子模块集成到更大的监控系统中,用于局部状态展示。

项目技术

AGauge 控件:一个开源的高仿汽车仪表盘控件,支持自定义刻度、标签、色带区间,通过 Value 属性驱动指针,提供 ValueChanged 和 ValueInRangeChanged 等事件。

Chart 控件:来自 System.Windows.Forms.DataVisualization.Charting 命名空间,支持多种图表类型,通过 DataBindXY 绑定横纵坐标数据。

事件驱动机制:滑块值变化触发表盘更新,表盘值变化触发标签刷新和告警判断,形成完整的响应链。

项目代码

动态数据绑定

private void MainFormTest_Load(object sender, EventArgs e)
{
    //这是添加的两组数据
    List<int> txData2 = new List<int>() { 201120122013201420152016 };
    List<int> tyData2 = new List<int>() { 967454 };
    List<int> txData3 = new List<int>() { 2012 };
    List<int> tyData3 = new List<int>() { 7 };
    //背景
    //ct.ChartAreas.Add(new ChartArea() { Name = "ca1" });     //背景框
    //ct.ChartAreas[0].Axes[0].MajorGrid.Enabled = false;       //X轴上网格
    //ct.ChartAreas[0].Axes[1].MajorGrid.Enabled = false;      //y轴上网格
    //ct.ChartAreas[0].Axes[0].MajorGrid.LineDashStyle = ChartDashStyle.Dash;   //网格类型 短横线
    //ct.ChartAreas[0].Axes[0].MajorGrid.LineColor = Color.Gray;
    //ct.ChartAreas[0].Axes[0].MajorTickMark.Enabled = false;                   //  x轴上突出的小点
    //ct.ChartAreas[0].Axes[1].MajorTickMark.Enabled = false;                  //
    //ct.ChartAreas[0].Axes[1].IsInterlaced = true;  //显示交错带 
    //ct.ChartAreas[0].Axes[0].LabelStyle.Format = "#年";                      //设置X轴显示样式
    //ct.ChartAreas[0].Axes[1].MajorGrid.LineDashStyle = ChartDashStyle.Dash;   //网格类型 短横线
    //ct.ChartAreas[0].Axes[1].MajorGrid.LineColor = Color.Black;
    //ct.ChartAreas[0].Axes[1].MajorGrid.LineWidth = 3;

    //ct.ChartAreas[0].BackColor = System.Drawing.Color.Transparent;          //设置区域内背景透明
    ////图表数据区,有多个重叠则循环添加
    //ct.Series.Add(new Series()); //添加一个图表序列
    //                             // ct.Series[0].XValueType = ChartValueType.String;  //设置X轴上的值类型
    //ct.Series[0].Label = "#VAL";                //设置显示X Y的值    
    //ct.Series[0].ToolTip = "#VALX年\r#VAL";     //鼠标移动到对应点显示数值
    //ct.Series[0].ChartArea = ct.ChartAreas[0].Name;                   //设置图表背景框
    //ct.Series[0].ChartType = SeriesChartType.Line;    //图类型(折线)
    //ct.Series[0].Points.DataBindXY(txData2, tyData2); //添加数据
    //                                                  //折线段配置
    //ct.Series[0].Color = Color.Red;               //线条颜色
    //ct.Series[0].BorderWidth = 3;                 //线条粗细
    //ct.Series[0].MarkerBorderColor = Color.Red;   //标记点边框颜色
    //ct.Series[0].MarkerBorderWidth = 3;             //标记点边框大小
    //ct.Series[0].MarkerColor = Color.Red;       //标记点中心颜色
    //ct.Series[0].MarkerSize = 5;                 //标记点大小
    //ct.Series[0].MarkerStyle = MarkerStyle.Circle;  //标记点类型

    //ct.Series.Add(new Series()); //添加一个图表序列
    //ct.Series[1].Label = "#VAL";                //设置显示X Y的值
    //ct.Series[1].ToolTip = "#VALX年\r#VAL";     //鼠标移动到对应点显示数值
    //ct.Series[1].ChartArea = "ca1";
    //ct.Series[1].ChartType = SeriesChartType.Line;    //图类型(折线)
    //ct.Series[1].Points.DataBindXY(txData3, tyData3); //添加数据
    //                                                  //折线段配置
    //ct.Series[1].Color = Color.Black;               //线条颜色
    //ct.Series[1].BorderWidth = 3;                   //线条粗细
    //ct.Series[1].MarkerBorderColor = Color.Black;   //标记点边框颜色
    //ct.Series[1].MarkerBorderWidth = 3;             //标记点边框大小
    //ct.Series[1].MarkerColor = Color.Black;         //标记点中心颜色
    //ct.Series[1].MarkerSize = 5;                    //标记点大小
    //ct.Series[1].MarkerStyle = MarkerStyle.Circle;  //标记点类型

    ct.Series["Series1"].ChartArea = ct.ChartAreas[0].Name;

    ct.Series["Series1"].Points.DataBindXY(txData2, tyData2); //添加数据
    ct.Series["Series1"].Points[0].Color = System.Drawing.Color.FromArgb(136,72,223);
    ct.Series["Series1"].Points[1].Color = System.Drawing.Color.FromArgb(21878117);
    ct.Series["Series1"].Points[2].Color = System.Drawing.Color.FromArgb(22913993);
    ct.Series["Series1"].Points[3].Color = System.Drawing.Color.FromArgb(31156201);
    ct.Series["Series1"].Points[4].Color = System.Drawing.Color.FromArgb(98108229);
    
    ////另外
    //饼图说明设置,这用来设置饼图每一块的信息显示在什么地方
    ct.Series["Series1"]["PieLabelStyle"] = "Outside";//将文字移到外侧
    ct.Series["Series1"]["PieLineColor"] = "Black";//绘制黑色的连线。
                                           //柱状图其他设置
    //ct.Series[0]["DrawingStyle"] = "Emboss";   //设置柱状平面形状
    //ct.Series[0]["PointWidth"] = "0.5"; //设置柱状大小
}

项目效果

运行程序后,拖动滑块,表盘指针平滑转动,中央数字同步跳变。

当数值滑入红色告警区(如 40–60),窗体下方面板立即变为红色,起到警示作用;一旦移出,颜色复原。

表盘组件

图片.png

表盘示例

图片.png

移动调动指针

图片.png

项目源码

源码包含图表初始化和动态区间添加功能。关键逻辑集中在事件处理函数中,如 trackBar1_ValueChanged 控制输入,aGauge1_ValueChanged 更新显示,aGauge1_ValueInRangeChanged 处理告警状态。图表数据在 Load 事件中绑定,采用硬编码列表便于演示,实际项目中可替换为数据库或 API 数据源。

Gitee:https://gitee.com/hanlin20171027/win-form-dial

总结

这个 WinForm 表盘项目虽小,却完整体现了桌面端数据可视化的核心思路:以用户感知为中心,用图形代替数字,用颜色传递状态。它没有复杂的架构,却足够解决实际问题。

对于需要快速开发本地监控界面的开发来说,这类轻量级方案依然具有很高的实用价值。

关键词

#WinForm#表盘控件、AGauge、#数据可视化、C#、#Chart图表#告警提示#桌面应用#事件驱动#工业监控

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。


群贤毕至

访客