乐于分享
好东西不私藏

这个 C# 节点编辑器,纯 GDI+ 实现,不依赖任何第三方库

这个 C# 节点编辑器,纯 GDI+ 实现,不依赖任何第三方库

Blender 的节点编辑器用过?Davinci Resolve 的调色节点呢?

那种”把功能模块拖出来,连上线,数据自己跑”的体验,确实比写代码爽。

问题在于:这种东西,一般只出现在专业软件里,想在自己的程序里做一个?你得自己从零画线、算连接点、处理拖拽事件——工作量不小。

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(100100);var ctrl = new STNodeControl();        ctrl.Text = "Button";        ctrl.Location = new Point(1010);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

你用过节点编辑器吗?用它来实现过什么功能?评论区聊聊。