在 WinForms 项目里需要展示一张折线图,翻遍了资料,发现要么是 WPF 的教程、要么是上古版本的 LiveCharts 1.x,对着文档折腾了半天,NuGet 包装上去控件工具箱里死活找不到,最后只能用 System.Windows.Forms.DataVisualization 凑合——渲染效果粗糙,动画没有,交互更别提了。
这种体验,相信写过 WinForms 数据面板的开发者都有过。
好消息是,LiveCharts 2(LiveCharts Core) 已经完整支持 WinForms,底层基于 SkiaSharp 渲染,性能和视觉效果比老版本提升了不止一个量级。本文从零开始,带你完成:
字数不多,但每一步都经过实际验证,跟着做完,你的项目里就有一张真正能跑起来的图表。
很多人在搜索资料时会同时看到 LiveCharts 和 LiveCharts2,这两者不是同一个库,不能混用。
LiveCharts 1.x 已停止维护,底层依赖 WPF 渲染管线,在 WinForms 里用起来很别扭,控件也不稳定。LiveCharts 2 是作者 beto-rodriguez 重写的版本,核心渲染引擎换成了 SkiaSharp,跨平台能力大幅提升,同一套 API 可以跑在 WinForms、WPF、MAUI、Blazor 等几乎所有 .NET UI 框架上。
对 WinForms 开发者来说,最直观的变化是:
LiveChartsCore.SkiaSharpView.WinForms目前 LiveCharts 2 仍处于 RC(候选发布)阶段,安装时需要勾选"包括预发行版",这是很多人第一步就卡住的原因。
打开 Visual Studio 2026,选择"创建新项目",模板选 Windows 窗体应用(注意不是 WPF,也不是控制台)。
项目名称随意,目标框架建议选 .NET 8.0。LiveCharts 2 向下兼容到 .NET Framework 4.6.2,如果你的老项目框架较低也没关系,但 .NET 8 的体验会更顺畅。
右键项目 → 管理 NuGet 程序包 → 搜索框输入:
LiveChartsCore.SkiaSharpView.WinForms

**关键操作:2.0我记得好几年了,终于正式版本有了,找到包后点击安装,Visual Studio 会自动拉取所有依赖项(包括 SkiaSharp 相关的底层库)。
如果你更喜欢命令行,在程序包管理器控制台执行:
powershellInstall-Package LiveChartsCore.SkiaSharpView.WinForms -IncludePrerelease
安装完成后,重新生成项目(Build → Rebuild Solution),然后打开工具箱,你应该能看到 CartesianChart、PieChart、GeoMap 等控件出现在工具箱列表里。
如果工具箱里没有出现控件,不要慌,这是个常见问题。关闭 VS,删除
.vs隐藏文件夹,重新打开项目再 Rebuild 一次,通常能解决。
从工具箱找到 CartesianChart,直接拖到 Form1 设计器上。调整控件大小,让它占满窗体的大部分区域。
拖进去之后,控件的默认名称是 cartesianChart1,后面代码里会用到这个名字。
打开 Form1.cs 的代码视图,在构造函数里加几行代码:
csharpusing LiveChartsCore;
using LiveChartsCore.SkiaSharpView;
namespace AppLiveChart01
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// 设置折线图数据系列
cartesianChart1.Series = new ISeries[]
{
new LineSeries<double>
{
// 模拟一周内某接口的平均响应时间(单位:ms)
Values = new double[] { 120, 98, 135, 87, 110, 76, 95 },
Fill = null, // 不填充线下面积
Name = "响应时间 (ms)"
}
};
}
}
}

F5 运行,一张带动画的折线图就出来了。数据点会有平滑的入场动画,鼠标悬停时还有 Tooltip 弹出,这些都是默认行为,不需要额外写任何代码。
上面的图表 X 轴显示的是数字索引,实际项目里通常需要显示日期或业务标签。加上 XAxes 配置:
csharpusing LiveChartsCore;
using LiveChartsCore.SkiaSharpView;
using LiveChartsCore.SkiaSharpView.Painting;
using SkiaSharp;
namespace AppLiveChart01
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// 用 SKTypeface 加载支持中文的字体
// "Microsoft YaHei" 在 Windows 上普遍存在,也可换成 "SimHei"、"SimSun" 等
var chineseTypeface = SKTypeface.FromFamilyName(
"Microsoft YaHei",
SKFontStyle.Normal
);
cartesianChart1.Series = new ISeries[]
{
new LineSeries<double>
{
Values = new double[] { 120, 98, 135, 87, 110, 76, 95 },
Fill = null,
Name = "响应时间 (ms)",
}
};
// X 轴:LabelsPaint 也显式指定字体,避免依赖 fallback
cartesianChart1.XAxes = new Axis[]
{
new Axis
{
Labels = new string[] { "周一", "周二", "周三", "周四", "周五", "周六", "周日" },
LabelsPaint = new SolidColorPaint
{
Color = SKColors.Gray,
SKTypeface = chineseTypeface
},
TextSize = 12
}
};
// Y 轴:NamePaint 和 LabelsPaint 都要指定字体
cartesianChart1.YAxes = new Axis[]
{
new Axis
{
Name = "响应时间 (ms)",
NamePaint = new SolidColorPaint
{
Color = SKColors.SlateGray,
SKTypeface = chineseTypeface
},
LabelsPaint = new SolidColorPaint
{
Color = SKColors.SlateGray,
SKTypeface = chineseTypeface
},
}
};
}
}
}

这样 X 轴就有了中文标签,Y 轴也有了说明文字,图表的可读性立刻提升了一个档次。
LiveCharts 2 底层使用 SkiaSharp 渲染文字,默认字体不包含中文字形。如果你的标签、Tooltip 或图例里有中文,不做配置的话会显示成方块或乱码。
解决方法是在应用启动时注册一个支持中文的字体。打开 Program.cs,修改成这样:
csharpusing LiveChartsCore;
using LiveChartsCore.SkiaSharpView;
using SkiaSharp;
namespace WinFormsSample;
static class Program
{
[STAThread]
static void Main()
{
// LiveCharts 全局配置,必须在 Application.Run 之前调用
LiveCharts.Configure(config =>
config
// 注册中文字体,让 SkiaSharp 能正确渲染汉字
.HasGlobalSKTypeface(SKFontManager.Default.MatchCharacter('汉'))
// 可选:切换暗色主题
// .AddDarkTheme()
);
ApplicationConfiguration.Initialize();
Application.Run(new Form1());
}
}
MatchCharacter('汉') 的作用是让 SkiaSharp 在系统字体库里自动匹配一个包含该字符的字体,通常会命中"微软雅黑"或"宋体"。这一步配置之后,所有中文标签都能正常显示了。 其中HasGlobalSKTypeface这个提示过期,但还可以用。
如果你的应用整体是深色风格,只需取消注释 .AddDarkTheme(),LiveCharts 会自动调整所有图表的背景色、网格线颜色和文字颜色,不需要逐个控件去改。
问题一:工具箱里找不到 LiveCharts 控件
原因通常是项目没有正确重新生成。步骤:右键解决方案 → 清理解决方案 → 重新生成解决方案,然后关闭并重新打开工具箱面板。
问题二:图表控件显示空白,什么都看不到
这是 LiveCharts 2 里一个已知的布局问题。控件本身没有默认尺寸约束,如果父容器是某些自动布局的 Panel,控件可能被压缩到 0 像素。解决方法:显式设置 cartesianChart1 的 Width 和 Height,或者把它放在一个固定大小的容器里。
问题三:中文显示方块
没有在 Program.cs 里调用 HasGlobalSKTypeface 注册字体,参考上一节的配置即可。
问题四:NuGet 搜不到包
没有勾选"包括预发行版",这是最常见的原因。另外确认 NuGet 源是 nuget.org,不是只有私有源。
搭好基础环境之后,很多场景需要图表实时更新数据,比如监控面板、设备采集数据展示等。LiveCharts 2 对这个场景有原生支持,只需要把数据集合换成 ObservableCollection<double>,数据变化时图表会自动刷新,无需手动调用任何 Invalidate 方法:
csharpusing LiveChartsCore;
using LiveChartsCore.SkiaSharpView;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AppLiveChart01
{
public partial class Form2 : Form
{
// 使用 ObservableCollection,数据变更时图表自动更新
private readonly ObservableCollection<double> _data = new() { 120, 98, 135, 87, 110 };
private System.Windows.Forms.Timer _timer = new();
public Form2()
{
InitializeComponent();
cartesianChart1.Series = new ISeries[]
{
new LineSeries<double>
{
Values = _data,
Fill = null
}
};
// 每秒追加一个随机数据点,模拟实时采集
_timer.Interval = 1000;
_timer.Tick += (s, e) =>
{
_data.Add(new Random().Next(60, 160));
// 保留最近 20 个点,防止数据无限增长
if (_data.Count > 20) _data.RemoveAt(0);
};
_timer.Start();
}
}
}

运行之后,图表会每秒平滑地追加一个新数据点,旧的点从左侧滑出。这个效果在工控监控、服务器性能面板等场景里非常实用,而且整个实现只有不到 20 行代码。
Program.cs 注册字体,这两步是最容易遗漏的。ObservableCollection + LineSeries 的组合,让实时数据图表的实现成本降到了极低,不需要额外的刷新逻辑。你目前的 WinForms 项目里用的是什么图表方案?是 DataVisualization、第三方商业控件,还是已经在用 LiveCharts?欢迎在评论区分享你的实际使用场景和遇到的问题,说不定能帮到有同样困惑的人。
另外,LiveCharts 2 除了折线图,还支持柱状图、饼图、散点图、热力图、地理地图等十几种图表类型,后续有机会可以逐一展开。如果你对某种特定图表类型的实现有需求,也可以在评论区告诉我。
如果你想系统深入 LiveCharts 2,推荐按以下顺序推进:
#C#开发 #WinForms #LiveCharts2 #数据可视化 #.NET
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!