编辑
2026-04-18
C#
00

目录

🤔 你是不是也遇到过这些情况?
🧱 先搞清楚:LiveCharts 2 和 1.x 的区别
🛠️ 环境搭建:一步一步来
第一步:创建 WinForms 项目
第二步:安装 NuGet 包
第三步:拖控件到窗体
📊 第一张图表:折线图实战
最简实现
加上 X 轴标签
⚙️ 主题与中文字体配置
为什么要单独处理中文字体?
暗色主题
🚧 踩坑预警:常见问题与排查
📈 进一步扩展:实时数据刷新
🎯 三句话总结
💬 聊聊你的实践
📚 学习路径建议

🤔 你是不是也遇到过这些情况?

在 WinForms 项目里需要展示一张折线图,翻遍了资料,发现要么是 WPF 的教程、要么是上古版本的 LiveCharts 1.x,对着文档折腾了半天,NuGet 包装上去控件工具箱里死活找不到,最后只能用 System.Windows.Forms.DataVisualization 凑合——渲染效果粗糙,动画没有,交互更别提了。

这种体验,相信写过 WinForms 数据面板的开发者都有过。

好消息是,LiveCharts 2(LiveCharts Core) 已经完整支持 WinForms,底层基于 SkiaSharp 渲染,性能和视觉效果比老版本提升了不止一个量级。本文从零开始,带你完成:

  • ✅ LiveCharts 2 在 WinForms 中的完整环境搭建
  • ✅ 第一张可运行的折线图
  • ✅ 主题配置与中文字体适配(这个坑很多人踩)
  • ✅ 常见报错与排查思路

字数不多,但每一步都经过实际验证,跟着做完,你的项目里就有一张真正能跑起来的图表。


🧱 先搞清楚:LiveCharts 2 和 1.x 的区别

很多人在搜索资料时会同时看到 LiveCharts 和 LiveCharts2,这两者不是同一个库,不能混用。

LiveCharts 1.x 已停止维护,底层依赖 WPF 渲染管线,在 WinForms 里用起来很别扭,控件也不稳定。LiveCharts 2 是作者 beto-rodriguez 重写的版本,核心渲染引擎换成了 SkiaSharp,跨平台能力大幅提升,同一套 API 可以跑在 WinForms、WPF、MAUI、Blazor 等几乎所有 .NET UI 框架上。

对 WinForms 开发者来说,最直观的变化是:

  • 图表控件可以直接拖到设计器里
  • 支持动画与实时数据刷新
  • 渲染质量接近矢量图,缩放不失真
  • NuGet 包按平台拆分,WinForms 有独立的包 LiveChartsCore.SkiaSharpView.WinForms

目前 LiveCharts 2 仍处于 RC(候选发布)阶段,安装时需要勾选"包括预发行版",这是很多人第一步就卡住的原因。


🛠️ 环境搭建:一步一步来

第一步:创建 WinForms 项目

打开 Visual Studio 2026,选择"创建新项目",模板选 Windows 窗体应用(注意不是 WPF,也不是控制台)。

项目名称随意,目标框架建议选 .NET 8.0。LiveCharts 2 向下兼容到 .NET Framework 4.6.2,如果你的老项目框架较低也没关系,但 .NET 8 的体验会更顺畅。

第二步:安装 NuGet 包

右键项目 → 管理 NuGet 程序包 → 搜索框输入:

LiveChartsCore.SkiaSharpView.WinForms

image.png

**关键操作:2.0我记得好几年了,终于正式版本有了,找到包后点击安装,Visual Studio 会自动拉取所有依赖项(包括 SkiaSharp 相关的底层库)。

如果你更喜欢命令行,在程序包管理器控制台执行:

powershell
Install-Package LiveChartsCore.SkiaSharpView.WinForms -IncludePrerelease

安装完成后,重新生成项目(Build → Rebuild Solution),然后打开工具箱,你应该能看到 CartesianChartPieChartGeoMap 等控件出现在工具箱列表里。

如果工具箱里没有出现控件,不要慌,这是个常见问题。关闭 VS,删除 .vs 隐藏文件夹,重新打开项目再 Rebuild 一次,通常能解决。

第三步:拖控件到窗体

从工具箱找到 CartesianChart,直接拖到 Form1 设计器上。调整控件大小,让它占满窗体的大部分区域。

拖进去之后,控件的默认名称是 cartesianChart1,后面代码里会用到这个名字。


📊 第一张图表:折线图实战

最简实现

打开 Form1.cs 的代码视图,在构造函数里加几行代码:

csharp
using 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)" } }; } } }

image.png

F5 运行,一张带动画的折线图就出来了。数据点会有平滑的入场动画,鼠标悬停时还有 Tooltip 弹出,这些都是默认行为,不需要额外写任何代码

加上 X 轴标签

上面的图表 X 轴显示的是数字索引,实际项目里通常需要显示日期或业务标签。加上 XAxes 配置:

csharp
using 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 }, } }; } } }

image.png

这样 X 轴就有了中文标签,Y 轴也有了说明文字,图表的可读性立刻提升了一个档次。


⚙️ 主题与中文字体配置

为什么要单独处理中文字体?

LiveCharts 2 底层使用 SkiaSharp 渲染文字,默认字体不包含中文字形。如果你的标签、Tooltip 或图例里有中文,不做配置的话会显示成方块或乱码。

解决方法是在应用启动时注册一个支持中文的字体。打开 Program.cs,修改成这样:

csharp
using 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 像素。解决方法:显式设置 cartesianChart1WidthHeight,或者把它放在一个固定大小的容器里。

问题三:中文显示方块

没有在 Program.cs 里调用 HasGlobalSKTypeface 注册字体,参考上一节的配置即可。

问题四:NuGet 搜不到包

没有勾选"包括预发行版",这是最常见的原因。另外确认 NuGet 源是 nuget.org,不是只有私有源。


📈 进一步扩展:实时数据刷新

搭好基础环境之后,很多场景需要图表实时更新数据,比如监控面板、设备采集数据展示等。LiveCharts 2 对这个场景有原生支持,只需要把数据集合换成 ObservableCollection<double>,数据变化时图表会自动刷新,无需手动调用任何 Invalidate 方法

csharp
using 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(); } } }

image.png

运行之后,图表会每秒平滑地追加一个新数据点,旧的点从左侧滑出。这个效果在工控监控、服务器性能面板等场景里非常实用,而且整个实现只有不到 20 行代码。


🎯 三句话总结

  • LiveCharts 2 是 WinForms 数据可视化目前最值得投入的选择,渲染质量和开发体验都远超内置图表控件。
  • 安装时记得勾选"包括预发行版",中文项目记得在 Program.cs 注册字体,这两步是最容易遗漏的。
  • ObservableCollection + LineSeries 的组合,让实时数据图表的实现成本降到了极低,不需要额外的刷新逻辑。

💬 聊聊你的实践

你目前的 WinForms 项目里用的是什么图表方案?是 DataVisualization、第三方商业控件,还是已经在用 LiveCharts?欢迎在评论区分享你的实际使用场景和遇到的问题,说不定能帮到有同样困惑的人。

另外,LiveCharts 2 除了折线图,还支持柱状图、饼图、散点图、热力图、地理地图等十几种图表类型,后续有机会可以逐一展开。如果你对某种特定图表类型的实现有需求,也可以在评论区告诉我。


📚 学习路径建议

如果你想系统深入 LiveCharts 2,推荐按以下顺序推进:

  1. 官方文档 Gallery(各类图表的最小示例,代码质量高)
  2. 数据绑定与 MVVM 模式(官方文档有专门章节)
  3. 自定义 Tooltip 与 Legend
  4. SkiaSharp 绘图基础(理解底层渲染,方便做深度定制)

#C#开发 #WinForms #LiveCharts2 #数据可视化 #.NET

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!