这个 C# 节点编辑器,纯 GDI+ 实现,不依赖任何第三方库
那种”把功能模块拖出来,连上线,数据自己跑”的体验,确实比写代码爽。
问题在于:这种东西,一般只出现在专业软件里,想在自己的程序里做一个?你得自己从零画线、算连接点、处理拖拽事件——工作量不小。
STNodeEditor 就是来解决这个问题的。一个 C# 写的节点编辑器,纯 GDI+ 实现,没有任何第三方依赖,100+Kb,NuGet 一行命令装上就能用。
https://github.com/DebugST/STNodeEditor
它是什么?
STNodeEditor 是一个轻量级的节点编辑器框架,纯 GDI+ 实现,无任何第三方依赖,仅 100+ Kb,包含三部分:
- TreeView
— 负责展示和检索节点,从这里把节点拖到画布上 - PropertyGrid
— 类似 WinForm 开发里的属性窗口,节点的属性在这里编辑 - NodeEditor
— 核心画布,节点在这里组合、连接、数据流通
三部分组合在一起,构成一套完整的节点编辑框架。

核心设计:像写 Form 一样写节点
STNodeEditor 最大的特点,是它的开发体验和 WinForm 很接近。
创建一个节点,就像创建一个 Form:
publicclassMyNode : STNode {protectedoverridevoidOnCreate() {base.OnCreate();this.Title = "MyNode";this.TitleColor = Color.FromArgb(200, Color.Goldenrod);this.AutoSize = false;this.Size = new Size(100, 100);var ctrl = new STNodeControl(); ctrl.Text = "Button"; ctrl.Location = new Point(10, 10);this.Controls.Add(ctrl); }}
继承 STNode,重写 OnCreate,往 Controls 里加控件——和写 WinForm 如出一辙。
STNode 的控件基类 STNodeControl 拥有和 System.Windows.Forms.Control 大量同名的属性和事件,用过 WinForm 的人几乎不需要额外学习成本。

数据输入输出:单连接和多连接
节点的核心价值是数据流通。STNodeEditor 的每个节点有 InputOptions 和 OutputOptions 两种连接点:
// 单连接模式:一个连接点同时只能被一个同数据类型连接this.InputOptions.Add("IN_1", typeof(string), true);// 多连接模式:一个连接点可以被多个同数据类型连接this.OutputOptions.Add("OUT", typeof(string), false);
数据传递靠 DataTransfer 事件——当一个选项收到数据,会自动触发事件,开发者在这里处理数据并通过 TransferData() 向下游节点投递。
m_op_time_in.DataTransfer += new STNodeOptionEventHandler(op_DataTransfer);voidop_DataTransfer(object sender, STNodeOptionEventArgs e) {if (e.Status != ConnectionStatus.Connected) return;var data = e.TargetOption.Data; // 拿到上游传来的数据// 处理后向下传递 m_op_out.TransferData(result);}
连接和断开都会触发事件,所以开发者需要判断连接状态。这种设计让每个节点只关心自己的输入输出,不需要知道数据最终流向哪里——节点之间耦合极低。
实际能做什么?
README 里给了一个时钟节点的例子:一个节点每秒输出当前时间,另一个节点接收并显示。两者在画布上连上线,数据就跑起来了,不需要写任何调度代码。
更复杂一点的例子:ImageInput 节点读取图片,ImageChannel 节点处理图片输出 RGB 和原图,ImageSize 节点接收并显示尺寸——三个节点组合成一个简单的图片处理流程。
作者的核心思路是:万物皆可节点化。只要功能可以模块化、流程化,就适合用节点编辑器来组织。


技术上的亮点
纯 GDI+ 实现,无任何依赖库。
100+Kb 的体积,不是压缩出来的,是真的没有第三方依赖。画线、渲染、控件,全部自己写。好处是装上就能用,不会有版本冲突或者包缺失的问题。
支持热拔插节点。
节点可以在运行时动态添加到编辑器或者从编辑器移除。配合 TreeView 的节点管理,用户可以在界面上直接切换功能模块,不需要改代码。
数据流和执行流分离。
默认情况下,节点之间的连线通了,数据就实时流动。但也支持”点启动按钮再执行”的模式——只要定义好 InputNode(入口)和 OutputNode(出口)类型的节点,主程序在合适的时机统一触发 Start/Stop 即可。这块在 README 里给了完整的实现思路。
谁适合用
需要做可视化流程功能的开发者。 比如图像处理工具、音频工作流、逻辑编排器——只要你的功能可以分解成”输入→处理→输出”的模式,STNodeEditor 都可以作为底层框架。
想研究节点编辑器实现的人。 纯 GDI+、无依赖、代码全开源(MIT 协议),是很好的学习样本。TreeView + PropertyGrid + NodeEditor 的组合设计,代码逻辑清晰,不算特别复杂但五脏俱全。
安装方式
一行 NuGet 命令:
PM> Install-Package ST.Library.UI -Version2.0.0
.NET 3.5 即可运行,VS2010 开始就支持。附带一个 WinForms Demo 和一个 WPF Demo,开箱即跑。

项目地址:
-
GitHub:https://github.com/DebugST/STNodeEditor -
文档:https://debugst.github.io/STNodeEditor/doc_cn.html -
NuGet: Install-Package ST.Library.UI -Version 2.0.0
你用过节点编辑器吗?用它来实现过什么功能?评论区聊聊。
夜雨聆风