- STNodeEditor
  - Properties
  - Protected fields
  - Events
  - Virtual method
  - public method
- STNode
  - Properties
  - Protected fields
  - Virtual method
  - public method
- STNodeOption
  - Properties
  - Events
  - Constructor
  - Virtual method
  - public method
- STNodePropertyGrid
  - Properties
  - Protected fields
  - Virtual method
  - public method
- STNodeTreeView
  - Properties
  - Virtual method
  - public method
- STNodeTreeCollection
  - Properties
  - Constructor
  - public method
- STNodeEditorPannel
  - Properties
  - public method
- STNodeAttribute
  - Properties
  - Constructor
- STNodePropertyAttribute
  - Properties
  - Constructor
- STNodePropertyDescriptor
  - Properties
  - Virtual method
  - public method

2021-04-29

# STNodeEditor

## Properties

Name | Type | Description
--- | --- | ---
CanvasOffsetX | float | 获取画布原点相对于控件 X 方向上的偏移位置
CanvasOffsetY | float | 获取画布原点相对于控件 Y 方向上的偏移位置
CanvasOffset | PointF | 获取画布原点相对于控件偏移位置
CanvasValidBounds | Rectangle | 获取画布中的有被用到的有效区域
CanvasScale | float | 获取画布的缩放比例
Curvature | float | 获取或设置 Option 之间连线的曲度
ShowMagnet | bool | 获取或设置移动画布中 Node 时候 是否启用磁铁效果
ShowBorder | bool | 获取或设置 移动画布中是否显示 Node 边框
ShowGrid | bool | 获取或设置画布中是否绘制背景网格线条
ShowLocation | bool | 获取或设置是否在画布边缘显示超出视角的 Node 位置信息
Nodes | STNodeCollection | 获取画布中 Node 集合
ActiveNode | STNode | 获取当前画布中被选中的活动 Node
HoverNode | STNode | 获取当前画布中鼠标悬停的 Node
GridColor | Color | 获取或设置绘制画布背景时 网格线条颜色
BorderColor | Color | 获取或设置画布中 Node 边框颜色
BorderHoverColor | Color | 获取或设置画布中悬停 Node 边框颜色
BorderSelectedColor | Color | 获取或设置画布中选中 Node 边框颜色
BorderActiveColor | Color | 获取或设置画布中活动 Node 边框颜色
MarkForeColor | Color | 获取或设置画布绘制 Node 标记详情采用的前景色
MarkBackColor | Color | 获取或设置画布绘制 Node 标记详情采用的背景色
MagnetColor | Color | 获取或设置画布中移动 Node 时候 磁铁标记颜色
SelectedRectangleColor | Color | 获取或设置画布中选择矩形区域的颜色
HighLineColor | Color | 获取或设置画布中高亮连线的颜色
LocationForeColor | Color | 获取或设置画布中边缘位置提示区域前景色
LocationBackColor | Color | 获取或设置画布中边缘位置提示区域背景色
UnknownTypeColor | Color | 获取或设置画布中当 Node 中 Option 数据类型无法确定时应当使用的颜色

## Protected fields

Name | Type | Description
--- | --- | ---
m_pt_in_control | Point | 当前鼠标在控件中的实时位置
m_pt_in_canvas | PointF | 当前鼠标在画布中的实时位置
m_pt_down_in_control | Point | 鼠标点击时在控件上的位置
m_pt_down_in_canvas | PointF | 鼠标点击时在画布中的位置
m_pt_canvas_old | PointF | 用于鼠标点击移动画布时候 鼠标点下时候的画布坐标位置
m_pt_dot_down | Point | 用于保存连线过程中保存点下 Option 的起点坐标
m_option_down | STNodeOption | 用于保存连线过程中鼠标点下的起点Option 当MouseUP时候 确定是否连接此节点
m_node_down | STNode | 当前鼠标点下的 STNode
m_mouse_in_control | bool | 当前鼠标是否位于控件中

## Events

Name | Description
--- | ---
ActiveChanged | 活动的节点发生变化时候发生
SelectedChanged | 选择的节点发生变化时候发生
HoverChanged | 悬停的节点发生变化时候发生
NodeAdded | 当节点被添加时候发生
NodeRemoved | 当节点被移除时候发生
CanvasMoved | 移动画布原点时候发生
CanvasScaled | 缩放画布时候发生
OptionConnected | 连接节点选项时候发生
OptionConnecting | 正在连接节点选项时候发生
OptionDisConnected | 断开节点选项时候发生
OptionDisConnecting | 正在断开节点选项时候发生

## Virtual method

OnDrawGrid

    /// <summary>
    /// 当绘制背景网格线时候发生
    /// </summary>
    /// <param name="dt">绘制工具</param>
    /// <param name="nWidth">需要绘制宽度</param>
    /// <param name="nHeight">需要绘制高度</param>
    protected virtual void OnDrawGrid(DrawingTools dt, int nWidth, int nHeight);

OnDrawNode

    /// <summary>
    /// 当绘制 Node 时候发生
    /// </summary>
    /// <param name="dt">绘制工具</param>
    /// <param name="rect">可视画布区域大小</param>
    protected virtual void OnDrawNode(DrawingTools dt, Rectangle rect);

OnDrawNodeBorder

    /// <summary>
    /// 当绘制 Node 边框时候发生
    /// </summary>
    /// <param name="dt">绘制工具</param>
    /// <param name="node">目标node</param>
    protected virtual void OnDrawNodeBorder(DrawingTools dt, STNode node);

OnDrawConnectedLine

    /// <summary>
    /// 当绘制已连接路径时候发生
    /// </summary>
    /// <param name="dt">绘制工具</param>
    protected virtual void OnDrawConnectedLine(DrawingTools dt);

OnDrawMark

    /// <summary>
    /// 当绘制 Mark 详情信息时候发生
    /// </summary>
    /// <param name="dt">绘制工具</param>
    protected virtual void OnDrawMark(DrawingTools dt);

OnDrawMagnet

    /// <summary>
    /// 当移动 Node 时候 需要显示对齐参考线时候发生
    /// </summary>
    /// <param name="dt">绘制工具</param>
    /// <param name="mi">匹配的磁铁信息</param>
    protected virtual void OnDrawMagnet(DrawingTools dt, MagnetInfo mi);

OnDrawSelectedRectangle

    /// <summary>
    /// 绘制选择的矩形区域
    /// </summary>
    /// <param name="dt">绘制工具</param>
    /// <param name="rectf">位于控件上的矩形区域</param>
    protected virtual void OnDrawSelectedRectangle(DrawingTools dt, RectangleF rectf);

OnDrawNodeOutLocation

    /// <summary>
    /// 绘制超出视觉区域的 Node 位置提示信息
    /// </summary>
    /// <param name="dt">绘制工具</param>
    /// <param name="sz">提示框边距</param>
    /// <param name="lstPts">超出视觉区域的 Node 位置信息</param>
    protected virtual void OnDrawNodeOutLocation(DrawingTools dt, Size sz, List<Point> lstPts);

OnDrawAlert

    /// <summary>
    /// 绘制提示信息
    /// </summary>
    /// <param name="dt">绘制工具</param>
    /// <param name="rect">需要绘制区域</param>
    /// <param name="strText">需要绘制文本</param>
    /// <param name="foreColor">信息前景色</param>
    /// <param name="backColor">信息背景色</param>
    /// <param name="al">信息位置</param>
    protected virtual void OnDrawAlert(DrawingTools dt, Rectangle rect, string strText, Color foreColor, Color backColor, AlertLocation al);

GetAlertRectangle

    /// <summary>
    /// 获取提示信息需要绘制的矩形区域
    /// </summary>
    /// <param name="g">绘图表面</param>
    /// <param name="strText">需要绘制文本</param>
    /// <param name="al">信息位置</param>
    /// <returns>矩形区域</returns>
    protected virtual Rectangle GetAlertRectangle(Graphics g, string strText, AlertLocation al);

## public method

FindNodeFromPoint

    /// <summary>
    /// 通过画布坐标进行寻找
    /// </summary>
    /// <param name="pt">画布中的坐标</param>
    /// <returns>寻找到的数据</returns>
    public NodeFindInfo FindNodeFromPoint(PointF pt);

GetSelectedNode

    /// <summary>
    /// 获取已经被选择的 Node 集合
    /// </summary>
    /// <returns>Node 集合</returns>
    public STNode[] GetSelectedNode();

CanvasToControl

    /// <summary>
    /// 将画布坐标转换为控件坐标
    /// </summary>
    /// <param name="number">参数</param>
    /// <param name="isX">是否为 X 坐标</param>
    /// <returns>转换后的坐标</returns>
    public float CanvasToControl(float number, bool isX);

CanvasToControl

    /// <summary>
    /// 将画布坐标转换为控件坐标
    /// </summary>
    /// <param name="pt">坐标</param>
    /// <returns>转换后的坐标</returns>
    public PointF CanvasToControl(PointF pt);

CanvasToControl

    /// <summary>
    /// 将画布坐标转换为控件坐标
    /// </summary>
    /// <param name="pt">坐标</param>
    /// <returns>转换后的坐标</returns>
    public Point CanvasToControl(Point pt);

CanvasToControl

    /// <summary>
    /// 将画布坐标转换为控件坐标
    /// </summary>
    /// <param name="rect">矩形区域</param>
    /// <returns>转换后的矩形区域</returns>
    public Rectangle CanvasToControl(Rectangle rect);

CanvasToControl

    /// <summary>
    /// 将画布坐标转换为控件坐标
    /// </summary>
    /// <param name="rect">矩形区域</param>
    /// <returns>转换后的矩形区域</returns>
    public RectangleF CanvasToControl(RectangleF rect);

ControlToCanvas

    /// <summary>
    /// 将控件坐标转换为画布坐标
    /// </summary>
    /// <param name="number">参数</param>
    /// <param name="isX">是否为 X 坐标</param>
    /// <returns>转换后的坐标</returns>
    public float ControlToCanvas(float number, bool isX);

ControlToCanvas

    /// <summary>
    /// 将控件坐标转换为画布坐标
    /// </summary>
    /// <param name="pt">坐标</param>
    /// <returns>转换后的坐标</returns>
    public Point ControlToCanvas(Point pt);

ControlToCanvas

    /// <summary>
    /// 将控件坐标转换为画布坐标
    /// </summary>
    /// <param name="pt">坐标</param>
    /// <returns>转换后的坐标</returns>
    public PointF ControlToCanvas(PointF pt);

ControlToCanvas

    /// <summary>
    /// 将控件坐标转换为画布坐标
    /// </summary>
    /// <param name="rect">矩形区域</param>
    /// <returns>转换后的区域</returns>
    public Rectangle ControlToCanvas(Rectangle rect);

ControlToCanvas

    /// <summary>
    /// 将控件坐标转换为画布坐标
    /// </summary>
    /// <param name="rect">矩形区域</param>
    /// <returns>转换后的区域</returns>
    public RectangleF ControlToCanvas(RectangleF rect);

MoveCanvas

    /// <summary>
    /// 移动画布原点坐标到指定的控件坐标位置
    /// 当不存在 Node 时候 无法移动
    /// </summary>
    /// <param name="x">X 坐标</param>
    /// <param name="y">Y 坐标</param>
    /// <param name="bAnimation">移动过程中是否启动动画效果</param>
    /// <param name="ma">指定需要修改的坐标参数</param>
    public void MoveCanvas(float x, float y, bool bAnimation, CanvasMoveArgs ma);

ScaleCanvas

    /// <summary>
    /// 缩放画布
    /// 当不存在 Node 时候 无法缩放
    /// </summary>
    /// <param name="f">缩放比例</param>
    /// <param name="x">缩放中心X位于控件上的坐标</param>
    /// <param name="y">缩放中心Y位于控件上的坐标</param>
    public void ScaleCanvas(float f, float x, float y);

GetConnectionInfo

    /// <summary>
    /// 获取当前已连接的 Option 对应关系
    /// </summary>
    /// <returns>连接信息集合</returns>
    public ConnectionInfo[] GetConnectionInfo();

GetCanvasImage

    /// <summary>
    /// 获取画布中指定矩形区域图像
    /// </summary>
    /// <param name="rect">画布中指定的矩形区域</param>
    /// <returns>图像</returns>
    public Image GetCanvasImage(Rectangle rect);

GetCanvasImage

    /// <summary>
    /// 获取画布中指定矩形区域图像
    /// </summary>
    /// <param name="rect">画布中指定的矩形区域</param>
    /// <param name="fScale">缩放比例</param>
    /// <returns>图像</returns>
    public Image GetCanvasImage(Rectangle rect, float fScale);

SaveCanvas

    /// <summary>
    /// 保存画布中的类容到文件中
    /// </summary>
    /// <param name="strFileName">文件路径</param>
    public void SaveCanvas(string strFileName);

SaveCanvas

    /// <summary>
    /// 保存画布中的类容到数据流
    /// </summary>
    /// <param name="s">数据流对象</param>
    public void SaveCanvas(Stream s);

GetCanvasData

    /// <summary>
    /// 获取画布中内容二进制数据
    /// </summary>
    /// <returns>二进制数据</returns>
    public byte[] GetCanvasData();

LoadAssembly

    /// <summary>
    /// 加载程序集
    /// </summary>
    /// <param name="strFiles">程序集集合</param>
    /// <returns>存在STNode类型的文件的个数</returns>
    public int LoadAssembly(string[] strFiles);

LoadAssembly

    /// <summary>
    /// 加载程序集
    /// </summary>
    /// <param name="strFile">指定需要加载的文件</param>
    /// <returns>是否加载成功</returns>
    public bool LoadAssembly(string strFile);

GetTypes

    /// <summary>
    /// 获取当前编辑器中已加载的Node类型
    /// </summary>
    /// <returns>类型集合</returns>
    public Type[] GetTypes();

LoadCanvas

    /// <summary>
    /// 从文件中加载数据
    /// 注意: 此方法并不会清空画布中数据 而是数据叠加
    /// </summary>
    /// <param name="strFileName">文件路径</param>
    public void LoadCanvas(string strFileName);

LoadCanvas

    /// <summary>
    /// 从二进制加载数据
    /// 注意: 此方法并不会清空画布中数据 而是数据叠加
    /// </summary>
    /// <param name="byData">二进制数据</param>
    public void LoadCanvas(byte[] byData);

LoadCanvas

    /// <summary>
    /// 从数据流中加载数据
    /// 注意: 此方法并不会清空画布中数据 而是数据叠加
    /// </summary>
    /// <param name="s">数据流对象</param>
    public void LoadCanvas(Stream s);

ShowAlert

    /// <summary>
    /// 在画布中显示提示信息
    /// </summary>
    /// <param name="strText">要显示的信息</param>
    /// <param name="foreColor">信息前景色</param>
    /// <param name="backColor">信息背景色</param>
    public void ShowAlert(string strText, Color foreColor, Color backColor);

ShowAlert

    /// <summary>
    /// 在画布中显示提示信息
    /// </summary>
    /// <param name="strText">要显示的信息</param>
    /// <param name="foreColor">信息前景色</param>
    /// <param name="backColor">信息背景色</param>
    /// <param name="al">信息要显示的位置</param>
    public void ShowAlert(string strText, Color foreColor, Color backColor, AlertLocation al);

ShowAlert

    /// <summary>
    /// 在画布中显示提示信息
    /// </summary>
    /// <param name="strText">要显示的信息</param>
    /// <param name="foreColor">信息前景色</param>
    /// <param name="backColor">信息背景色</param>
    /// <param name="nTime">信息持续时间</param>
    /// <param name="al">信息要显示的位置</param>
    /// <param name="bRedraw">是否立即重绘</param>
    public void ShowAlert(string strText, Color foreColor, Color backColor, int nTime, AlertLocation al, bool bRedraw);

SetActiveNode

    /// <summary>
    /// 设置画布中活动的节点
    /// </summary>
    /// <param name="node">需要被设置为活动的节点</param>
    /// <returns>设置前的活动节点</returns>
    public STNode SetActiveNode(STNode node);

AddSelectedNode

    /// <summary>
    /// 向画布中添加一个被选中的节点
    /// </summary>
    /// <param name="node">需要被选中的节点</param>
    /// <returns>是否添加成功</returns>
    public bool AddSelectedNode(STNode node);

RemoveSelectedNode

    /// <summary>
    /// 向画布中移除一个被选中的节点
    /// </summary>
    /// <param name="node">需要被移除的节点</param>
    /// <returns>是移除否成功</returns>
    public bool RemoveSelectedNode(STNode node);

SetTypeColor

    /// <summary>
    /// 向编辑器中添加默认数据类型颜色
    /// </summary>
    /// <param name="t">数据类型</param>
    /// <param name="clr">对应颜色</param>
    /// <returns>被设置后的颜色</returns>
    public Color SetTypeColor(Type t, Color clr);

SetTypeColor

    /// <summary>
    /// 向编辑器中添加默认数据类型颜色
    /// </summary>
    /// <param name="t">数据类型</param>
    /// <param name="clr">对应颜色</param>
    /// <param name="bReplace">若已经存在是否替换颜色</param>
    /// <returns>被设置后的颜色</returns>
    public Color SetTypeColor(Type t, Color clr, bool bReplace);

# STNode

## Properties

Name | Type | Description
--- | --- | ---
Owner | STNodeEditor | 获取当前 Node 所有者
IsSelected | bool | 获取或设置 Node 是否处于被选中状态
IsActive | bool | 获取 Node 是否处于活动状态
TitleColor | Color | 获取或设置标题背景颜色
MarkColor | Color | 获取或设置标记信息背景颜色
ForeColor | Color | 获取或设置当前 Node 前景色
BackColor | Color | 获取或设置当前 Node 背景色
Title | string | 获取或设置 Node 标题
Mark | string | 获取或设置 Node 标记信息
Left | int | 获取或设置 Node 左边坐标
Top | int | 获取或设置 Node 上边坐标
Width | int | 获取或设置 Node 宽度 当AutoSize被设置时 无法设置此值
Height | int | 获取或设置 Node 高度 当AutoSize被设置时 无法设置此值
ItemHeight | int | 获取或设置 Node 每个选项的高度
AutoSize | bool | 获取或设置 Node 是否自动计算宽高
Right | int | 获取 Node 右边边坐标
Bottom | int | 获取 Node 下边坐标
Rectangle | Rectangle | 获取 Node 矩形区域
TitleRectangle | Rectangle | 获取 Node 标题矩形区域
MarkRectangle | Rectangle | 获取 Node 标记矩形区域
TitleHeight | int | 获取或设置 Node 标题高度
InputOptionsCount | int | 获取输入选项集合个数
OutputOptionsCount | int | 获取输出选项个数
ControlsCount | int | 获取 Node 所包含的控件集合个数
Location | Point | 获取 Node 坐标位置
Size | Size | 获取 Node 大小
LockOption | bool | 获取或设置是否锁定Option选项 锁定后不在接受连接
LockLocation | bool | 获取或设置是否锁定Node位置 锁定后不可移动
ContextMenuStrip | ContextMenuStrip | 获取或设置当前Node 上下文菜单
Tag | object | 获取或设置用户自定义保存的数据
Guid | Guid | 获取全局唯一标识
LetGetOptions | bool | 获取或设置是否允许外部访问STNodeOption

## Protected fields

Name | Type | Description
--- | --- | ---
m_ctrl_active | STNodeControl | 当前Node中 活动的控件
m_ctrl_hover | STNodeControl | 当前Node中 悬停的控件
m_ctrl_down | STNodeControl | 当前Node中 鼠标点下的控件

## Virtual method

OnCreate

    /// <summary>
    /// 当Node被构造时候发生
    /// </summary>
    protected virtual void OnCreate();

OnDrawNode

    /// <summary>
    /// 绘制整个Node
    /// </summary>
    /// <param name="dt">绘制工具</param>
    protected internal virtual void OnDrawNode(DrawingTools dt);

OnDrawTitle

    /// <summary>
    /// 绘制Node标题部分
    /// </summary>
    /// <param name="dt">绘制工具</param>
    protected virtual void OnDrawTitle(DrawingTools dt);

OnDrawBody

    /// <summary>
    /// 绘制Node主体部分 除去标题部分
    /// </summary>
    /// <param name="dt">绘制工具</param>
    protected virtual void OnDrawBody(DrawingTools dt);

OnDrawMark

    /// <summary>
    /// 绘制标记信息
    /// </summary>
    /// <param name="dt">绘制工具</param>
    protected internal virtual void OnDrawMark(DrawingTools dt);

OnDrawOptionDot

    /// <summary>
    /// 绘制选项连线的点
    /// </summary>
    /// <param name="dt">绘制工具</param>
    /// <param name="op">指定的选项</param>
    protected virtual void OnDrawOptionDot(DrawingTools dt, STNodeOption op);

OnDrawOptionText

    /// <summary>
    /// 绘制选项的文本
    /// </summary>
    /// <param name="dt">绘制工具</param>
    /// <param name="op">指定的选项</param>
    protected virtual void OnDrawOptionText(DrawingTools dt, STNodeOption op);

OnSetOptionDotLocation

    /// <summary>
    /// 当计算Option连线点位置时候发生
    /// </summary>
    /// <param name="op">需要计算的Option</param>
    /// <param name="pt">自动计算出的位置</param>
    /// <param name="nIndex">当前Option的索引</param>
    /// <returns>新的位置</returns>
    protected virtual Point OnSetOptionDotLocation(STNodeOption op, Point pt, int nIndex);

OnSetOptionTextRectangle

    /// <summary>
    /// 当计算Option文本区域时候发生
    /// </summary>
    /// <param name="op">需要计算的Option</param>
    /// <param name="rect">自动计算出的区域</param>
    /// <param name="nIndex">当前Option的索引</param>
    /// <returns>新的区域</returns>
    protected virtual Rectangle OnSetOptionTextRectangle(STNodeOption op, Rectangle rect, int nIndex);

GetDefaultNodeSize

    /// <summary>
    /// 获取当前STNode所需要的默认大小
    /// 返回的大小并不会限制绘制区域 任然可以在此区域之外绘制
    /// 但是并不会被STNodeEditor所接受 并触发对应事件
    /// </summary>
    /// <param name="g">绘图面板</param>
    /// <returns>计算出来的大小</returns>
    protected virtual Size GetDefaultNodeSize(Graphics g);

OnBuildMarkRectangle

    /// <summary>
    /// 计算当前Mark所需要的矩形区域
    /// 返回的大小并不会限制绘制区域 任然可以在此区域之外绘制
    /// 但是并不会被STNodeEditor所接受 并触发对应事件
    /// </summary>
    /// <param name="g">绘图面板</param>
    /// <returns>计算后的区域</returns>
    protected virtual Rectangle OnBuildMarkRectangle(Graphics g);

OnSaveNode

    /// <summary>
    /// 当需要保存时候 此Node有哪些需要额外保存的数据
    /// 注意: 保存时并不会进行序列化 还原时候仅重新通过空参数构造器创建此Node
    /// 然后调用 OnLoadNode() 将保存的数据进行还原
    /// </summary>
    /// <param name="dic">需要保存的数据</param>
    protected virtual void OnSaveNode(Dictionary<string, byte[]> dic);

OnLoadNode

    /// <summary>
    /// 当还原该节点时候会将 OnSaveNode() 所返回的数据重新传入此函数
    /// </summary>
    /// <param name="dic">保存时候的数据</param>
    protected internal virtual void OnLoadNode(Dictionary<string, byte[]> dic);

OnEditorLoadCompleted

    /// <summary>
    /// 当编辑器加载完成所有的节点时候发生
    /// </summary>
    protected internal virtual void OnEditorLoadCompleted();

SetOptionText

    /// <summary>
    /// 设置Option的文本信息
    /// </summary>
    /// <param name="op">目标Option</param>
    /// <param name="strText">文本</param>
    /// <returns>是否成功</returns>
    protected bool SetOptionText(STNodeOption op, string strText);

SetOptionTextColor

    /// <summary>
    /// 设置Option文本信息颜色
    /// </summary>
    /// <param name="op">目标Option</param>
    /// <param name="clr">颜色</param>
    /// <returns>是否成功</returns>
    protected bool SetOptionTextColor(STNodeOption op, Color clr);

SetOptionDotColor

    /// <summary>
    /// 设置Option连线点颜色
    /// </summary>
    /// <param name="op">目标Option</param>
    /// <param name="clr">颜色</param>
    /// <returns>是否成功</returns>
    protected bool SetOptionDotColor(STNodeOption op, Color clr);

OnOwnerChanged

    /// <summary>
    /// 当所有者发生改变时候发生
    /// </summary>
    protected virtual void OnOwnerChanged();

OnSelectedChanged

    /// <summary>
    /// 当选中状态改变时候发生
    /// </summary>
    protected virtual void OnSelectedChanged();

OnActiveChanged

    /// <summary>
    /// 当活动状态改变时候发生
    /// </summary>
    protected virtual void OnActiveChanged();

SetOptionsLocation

    /// <summary>
    /// 计算每个Option的位置
    /// </summary>
    protected virtual void SetOptionsLocation();

## public method

Invalidate

    /// <summary>
    /// 重绘Node
    /// </summary>
    public void Invalidate();

Invalidate

    /// <summary>
    /// 重绘 Node 指定区域
    /// </summary>
    /// <param name="rect">Node 指定区域</param>
    public void Invalidate(Rectangle rect);

GetInputOptions

    /// <summary>
    /// 获取此Node所包含的输入Option集合
    /// </summary>
    /// <returns>Option集合</returns>
    public STNodeOption[] GetInputOptions();

GetOutputOptions

    /// <summary>
    /// 获取此Node所包含的输出Option集合
    /// </summary>
    /// <returns>Option集合</returns>
    public STNodeOption[] GetOutputOptions();

SetSelected

    /// <summary>
    /// 设置Node的选中状态
    /// </summary>
    /// <param name="bSelected">是否选中</param>
    /// <param name="bRedraw">是否重绘</param>
    public void SetSelected(bool bSelected, bool bRedraw);

# STNodeOption

## Properties

Name | Type | Description
--- | --- | ---
Owner | STNode | 获取当前 Option 所属的 Node
IsSingle | bool | 获取当前 Option 是否仅能被连接一次
IsInput | bool | 获取当前 Option 是否是输入选项
TextColor | Color | 获取或设置当前 Option 文本颜色
DotColor | Color | 获取或设置当前 Option 连接点的颜色
Text | string | 获取或设置当前 Option 显示文本 当AutoSize被设置时 无法修改此属性
DotLeft | int | 获取当前 Option 连接点的左边坐标
DotTop | int | 获取当前 Option 连接点的上边坐标
DotSize | int | 获取当前 Option 连接点的宽度
TextRectangle | Rectangle | 获取当前 Option 文本区域
Data | object | 获取或者设置当前 Option 所包含的数据
DataType | Type | 获取当前 Option 数据类型
DotRectangle | Rectangle | 获取当前 Option 连接点的区域
ConnectionCount | int | 获取当前 Option 被连接的个数

## Events

Name | Description
--- | ---
Connected | 当被连接时候发生
Connecting | 当连接开始发生时发生
DisConnected | 当连接断开时候发生
DisConnecting | 当连接开始断开时发生
DataTransfer | 当有数据传递时候发生

## Constructor

Constructor

    /// <summary>
    /// 构造一个 Option
    /// </summary>
    /// <param name="strText">显示文本</param>
    /// <param name="dataType">数据类型</param>
    /// <param name="bSingle">是否为单连接</param>
    public STNodeOption(string strText, Type dataType, bool bSingle);

## Virtual method

Invalidate

    /// <summary>
    /// 重绘整个控件
    /// </summary>
    protected void Invalidate();

ConnectingOption

    /// <summary>
    /// 当前 Option 开始连接目标 Option
    /// </summary>
    /// <param name="op">需要连接的 Option</param>
    /// <returns>是否允许继续操作</returns>
    protected virtual bool ConnectingOption(STNodeOption op);

DisConnectingOption

    /// <summary>
    /// 当前 Option 开始断开目标 Option
    /// </summary>
    /// <param name="op">需要断开的 Option</param>
    /// <returns>是否允许继续操作</returns>
    protected virtual bool DisConnectingOption(STNodeOption op);

## public method

DisConnectionAll

    /// <summary>
    /// 断开当前 Option 的所有连接
    /// </summary>
    public void DisConnectionAll();

GetConnectedOption

    /// <summary>
    /// 获取当前 Option 所连接的 Option 集合
    /// </summary>
    /// <returns>如果为null 则表示不存在所有者 否则返回集合</returns>
    public List<STNodeOption> GetConnectedOption();

TransferData

    /// <summary>
    /// 向当前 Option 所连接的所有 Option 投递数据
    /// </summary>
    public void TransferData();

TransferData

    /// <summary>
    /// 向当前 Option 所连接的所有 Option 投递数据
    /// </summary>
    /// <param name="data">需要投递的数据</param>
    public void TransferData(object data);

TransferData

    /// <summary>
    /// 向当前 Option 所连接的所有 Option 投递数据
    /// </summary>
    /// <param name="data">需要投递的数据</param>
    /// <param name="bDisposeOld">是否释放旧数据</param>
    public void TransferData(object data, bool bDisposeOld);

# STNodePropertyGrid

## Properties

Name | Type | Description
--- | --- | ---
STNode | STNode | 当前显示的STNode
ItemHoverColor | Color | 获取或设置属性选项被鼠标悬停时候背景色
ItemSelectedColor | Color | 获取或设置属性选项被选中时候背景色 当AutoColor被设置时此属性不能被设置
ItemValueBackColor | Color | 获取或设置属性选项值背景色
TitleColor | Color | 获取或设置默认标题背景色
ErrorColor | Color | 获取或设置属性设置错误时候提示信息背景色
DescriptionColor | Color | 获取或设置属性描述信息背景色
ShowTitle | bool | 获取或设置是否显示节点标题
AutoColor | bool | 获取或设置是否根据STNode自动设置控件高亮颜色
InfoFirstOnDraw | bool | 获取或当节点被设置时候 是否优先绘制信息面板
ReadOnlyModel | bool | 获取或设置当前属性编辑器是否处于只读模式
ScrollOffset | int | 获取当前滚动条高度

## Protected fields

Name | Type | Description
--- | --- | ---
m_rect_link | Rectangle | 作者链接地址区域
m_rect_help | Rectangle | 查看帮助按钮区域
m_rect_title | Rectangle | 编辑器标题区域
m_rect_switch | Rectangle | 面板切换按钮区域
m_nOffsetY | int | 控件在绘制过程中使用的垂直滚动偏移
m_nInfoOffsetY | int | 保存的信息面板垂直滚动偏移
m_nPropertyOffsetY | int | 保存的属性面板垂直滚动偏移
m_nVHeight | int | 控件在绘制过程中使用的绘图区域总高度
m_nInfoVHeight | int | 保存的信息面板需要的总高度
m_nPropertyVHeight | int | 保存的属性面板需要的总高度
m_nInfoLeft | int | 信息面板中Key显示需要的水平宽度

## Virtual method

OnPaint

    /// <summary>
    /// 当控件重绘时候发生
    /// </summary>
    /// <param name="e">事件参数</param>
    protected override void OnPaint(PaintEventArgs e);

OnMouseMove

    /// <summary>
    /// 当鼠标在控件上移动时候发生
    /// </summary>
    /// <param name="e">事件参数</param>
    protected override void OnMouseMove(MouseEventArgs e);

OnMouseDown

    /// <summary>
    /// 当鼠标在控件上点下时候发生
    /// </summary>
    /// <param name="e">事件参数</param>
    protected override void OnMouseDown(MouseEventArgs e);

OnMouseUp

    /// <summary>
    /// 当鼠标在控件上抬起时候发生
    /// </summary>
    /// <param name="e">事件参数</param>
    protected override void OnMouseUp(MouseEventArgs e);

OnMouseLeave

    /// <summary>
    /// 当鼠标离开控件时候发生
    /// </summary>
    /// <param name="e">事件参数</param>
    protected override void OnMouseLeave(EventArgs e);

OnMouseWheel

    /// <summary>
    /// 当鼠标在控件上滚动滚轮时候发生
    /// </summary>
    /// <param name="e">事件参数</param>
    protected override void OnMouseWheel(MouseEventArgs e);

OnResize

    /// <summary>
    /// 当控件尺寸发生改变时候发生
    /// </summary>
    /// <param name="e">事件参数</param>
    protected override void OnResize(EventArgs e);

OnDrawPropertyItem

    /// <summary>
    /// 当绘制属性选项时候发生
    /// </summary>
    /// <param name="dt">绘制工具</param>
    /// <param name="item">目标属性选项描述器</param>
    /// <param name="nIndex">选项所在索引</param>
    protected virtual void OnDrawPropertyItem(DrawingTools dt, STNodePropertyDescriptor item, int nIndex);

OnDrawTitle

    /// <summary>
    /// 绘制属性窗口标题
    /// </summary>
    /// <param name="dt">绘制工具</param>
    protected virtual void OnDrawTitle(DrawingTools dt);

OnDrawDescription

    /// <summary>
    /// 当需要绘制属性描述信息时发生
    /// </summary>
    /// <param name="dt">绘制工具</param>
    protected virtual void OnDrawDescription(DrawingTools dt);

OnDrawErrorInfo

    /// <summary>
    /// 当需要绘制错误信息时发生
    /// </summary>
    /// <param name="dt">绘制工具</param>
    protected virtual void OnDrawErrorInfo(DrawingTools dt);

OnDrawInfo

    /// <summary>
    /// 当绘制节点信息时候发生
    /// </summary>
    /// <param name="dt">绘制工具</param>
    protected virtual void OnDrawInfo(DrawingTools dt);

OnProcessPropertyMouseDown

    /// <summary>
    /// 当在属性面板鼠标点下时候发生
    /// </summary>
    /// <param name="e">鼠标事件参数</param>
    protected virtual void OnProcessPropertyMouseDown(MouseEventArgs e);

OnProcessInfoMouseDown

    /// <summary>
    /// 当在信息面板鼠标点下时候发生
    /// </summary>
    /// <param name="e">鼠标事件参数</param>
    protected virtual void OnProcessInfoMouseDown(MouseEventArgs e);

OnProcessPropertyMouseMove

    /// <summary>
    /// 当在属性面板鼠标移动时候发生
    /// </summary>
    /// <param name="e">鼠标事件参数</param>
    protected virtual void OnProcessPropertyMouseMove(MouseEventArgs e);

OnProcessHelpMouseMove

    /// <summary>
    /// 当在信息面板鼠标移动时候发生
    /// </summary>
    /// <param name="e">鼠标事件参数</param>
    protected virtual void OnProcessHelpMouseMove(MouseEventArgs e);

## public method

SetNode

    /// <summary>
    /// 设置需要显示的STNode节点
    /// </summary>
    /// <param name="node">目标节点</param>
    public void SetNode(STNode node);

SetInfoKey

    /// <summary>
    /// 设置信息页面Key的显示文本
    /// </summary>
    /// <param name="strAuthor">作者</param>
    /// <param name="strMail">邮箱</param>
    /// <param name="strLink">连接</param>
    /// <param name="strHelp">查看帮助</param>
    public void SetInfoKey(string strAuthor, string strMail, string strLink, string strHelp);

SetErrorMessage

    /// <summary>
    /// 设置要显示的错误信息
    /// </summary>
    /// <param name="strText">错误信息</param>
    public void SetErrorMessage(string strText);

# STNodeTreeView

## Properties

Name | Type | Description
--- | --- | ---
ItemBackColor | Color | 获取或设置每行属性选项背景色
ItemHoverColor | Color | 获取或设置属性选项被鼠标悬停时候背景色
TitleColor | Color | 获取或设置顶部检索区域背景色
TextBoxColor | Color | 获取或设置检索文本框的背景色
HightLightTextColor | Color | 获取或设置检索时候高亮文本颜色
InfoButtonColor | Color | 获取或设置信息显示按钮颜色 若设置AutoColor无法设置此属性值
FolderCountColor | Color | 获取或设置统计个数的文本颜色
ShowFolderCount | bool | 获取或设置是否统计STNode的个数
ShowInfoButton | bool | 获取或设置是否显示信息按钮
InfoPanelIsLeftLayout | bool | 获取或设置预览窗口是否是向左布局
AutoColor | bool | 获取或设置控件中部分颜色来之对应的STNode的标题颜色
Editor | STNodeEditor | 获取节点预览时候使用的STNodeEditor
PropertyGrid | STNodePropertyGrid | 获取节点预览时候使用的STNodePropertyGrid

## Virtual method

OnDrawSearch

    /// <summary>
    /// 当绘制检索文本区域时候发生
    /// </summary>
    /// <param name="dt">绘制工具</param>
    protected virtual void OnDrawSearch(DrawingTools dt);

OnStartDrawItem

    /// <summary>
    /// 当开始绘制树节点的每一个节点时候发生
    /// </summary>
    /// <param name="dt">绘制工具</param>
    /// <param name="Items">当前需要绘制的集合</param>
    /// <param name="nCounter">已经绘制个数的计数器</param>
    /// <param name="nLevel">当前位于第几级子集合</param>
    /// <returns>已经绘制个数</returns>
    protected virtual int OnStartDrawItem(DrawingTools dt, STNodeTreeCollection Items, int nCounter, int nLevel);

OnDrawItem

    /// <summary>
    /// 当绘制树节点每一个节点时候发生
    /// </summary>
    /// <param name="dt">绘制工具</param>
    /// <param name="items">当前需要绘制的集合</param>
    /// <param name="nCounter">已经绘制个数的计数器</param>
    /// <param name="nLevel">当前位于第几级子集合</param>
    protected virtual void OnDrawItem(DrawingTools dt, STNodeTreeCollection items, int nCounter, int nLevel);

OnDrawSwitch

    /// <summary>
    /// 当绘制树节点展开与关闭开关时候发生
    /// </summary>
    /// <param name="dt">绘制工具</param>
    /// <param name="items">当前需要绘制的集合</param>
    protected virtual void OnDrawSwitch(DrawingTools dt, STNodeTreeCollection items);

OnDrawItemText

    /// <summary>
    /// 当绘制树节点的文本时候发生
    /// </summary>
    /// <param name="dt">绘制工具</param>
    /// <param name="items">当前需要绘制的集合</param>
    /// <param name="rect">文本域所在矩形区域</param>
    protected virtual void OnDrawItemText(DrawingTools dt, STNodeTreeCollection items, Rectangle rect);

OnDrawItemIcon

    /// <summary>
    /// 当绘制树节点图标时候发生
    /// </summary>
    /// <param name="dt">绘制工具</param>
    /// <param name="items">当前需要绘制的集合</param>
    /// <param name="rect">文本域所在矩形区域</param>
    protected virtual void OnDrawItemIcon(DrawingTools dt, STNodeTreeCollection items, Rectangle rect);

## public method

Search

    /// <summary>
    /// 在控件中检索STNode
    /// </summary>
    /// <param name="strText">需要检索的文本</param>
    public void Search(string strText);

AddNode

    /// <summary>
    /// 向控件中添加一个STNode类型
    /// </summary>
    /// <param name="stNodeType">STNode类型</param>
    /// <returns>是否添加成功</returns>
    public bool AddNode(Type stNodeType);

LoadAssembly

    /// <summary>
    /// 从文件中向控件添加STNode类型
    /// </summary>
    /// <param name="strFile">指定文件路径</param>
    /// <returns>添加成功个数</returns>
    public int LoadAssembly(string strFile);

Clear

    /// <summary>
    /// 清空控件中所有STNode类型
    /// </summary>
    public void Clear();

RemoveNode

    /// <summary>
    /// 向控件中移除一个STNode类型
    /// </summary>
    /// <param name="stNodeType">STNode类型</param>
    /// <returns>是否移除成功</returns>
    public bool RemoveNode(Type stNodeType);

# STNodeTreeCollection

STNodeTreeCollection类被protected修饰 在STNodeTreeView内部 仅继承STNodeTreeView才能访问

## Properties

Name | Type | Description
--- | --- | ---
Name | string | 获取当前树节点显示名称
NameLower | string | 获取当前树节点显示名称的小写字符串
STNodeType | Type | 获取当前树节点对应的STNode类型
Parent | STNodeTreeCollection | 获取当前树节点的父级树节点
STNodeCount | int | 获取当前树节点下拥有的STNode类型个数
Path | string | 获取当前树节点对应STNode类型在树控件中对应路径
IsOpen | bool | 获取当前或设置树节点是否为打开状态
IsLibraryRoot | bool | 获取当前树节点是否为加载模块的根路劲节点
DisplayRectangle | Rectangle | 获取当前树节点在控件中的显示区域
SwitchRectangle | Rectangle | 获取当前树节点在控件中的开关按钮区域
InfoRectangle | Rectangle | 获取当前树节点在控件中的信息按钮区域
STNodeTypeColor | Color | 获取当前树节点对应STNode类型的标题颜色
Count | int | 获取当前树节点所包含子节点个数

## Constructor

Constructor

    /// <summary>
    /// 构造一颗树节点集合
    /// </summary>
    /// <param name="strName">当前树节点在控件中的显示名称</param>
    public STNodeTreeCollection(string strName);

## public method

Add

    /// <summary>
    /// 向当前树节点中添加一个子节点
    /// </summary>
    /// <param name="strName">节点显示名称</param>
    /// <returns>添加后的子节点集合</returns>
    public STNodeTreeCollection Add(string strName);

Remove

    /// <summary>
    /// 向当前树节点中删除一个子集合
    /// </summary>
    /// <param name="strName">子集合名称</param>
    /// <param name="isAutoDelFolder">是否递归向上自动清空无用节点</param>
    /// <returns>是否删除成功</returns>
    public bool Remove(string strName, bool isAutoDelFolder);

Clear

    /// <summary>
    /// 清空当前树节点中所有子节点
    /// </summary>
    public void Clear();

GetKeys

    /// <summary>
    /// 获取当前树节点中所有的名称数组
    /// </summary>
    /// <returns></returns>
    public string[] GetKeys();

Copy

    /// <summary>
    /// 拷贝当前树节点集合中所有数据
    /// </summary>
    /// <returns>拷贝的副本</returns>
    public STNodeTreeCollection Copy();

GetEnumerator

    /// <summary>
    /// 返回 System.Collections.IEnumerator 的 Array
    /// </summary>
    /// <returns></returns>
    public IEnumerator GetEnumerator();

# STNodeEditorPannel

## Properties

Name | Type | Description
--- | --- | ---
LeftLayout | bool | 获取或设置是否是左边布局
SplitLineColor | Color | 获取或这是分割线颜色
HandleLineColor | Color | 获取或设置分割线手柄颜色
ShowScale | bool | 获取或设置编辑器缩放时候显示比例
ShowConnectionStatus | bool | 获取或设置节点连线时候是否显示状态
X | int | 获取或设置分割线水平宽度
Y | int | 获取或设置分割线垂直高度
Editor | STNodeEditor | 获取面板中的STNodeEditor
TreeView | STNodeTreeView | 获取面板中的STNodeTreeView
PropertyGrid | STNodePropertyGrid | 获取面板中的STNodePropertyGrid

## public method

AddSTNode

    /// <summary>
    /// 向树控件中添加一个STNode
    /// </summary>
    /// <param name="stNodeType">STNode类型</param>
    /// <returns>是否添加成功</returns>
    public bool AddSTNode(Type stNodeType);

LoadAssembly

    /// <summary>
    /// 从程序集中加载STNode
    /// </summary>
    /// <param name="strFileName">程序集路径</param>
    /// <returns>添加成功个数</returns>
    public int LoadAssembly(string strFileName);

SetConnectionStatusText

    /// <summary>
    /// 设置编辑器显示连接状态的文本
    /// </summary>
    /// <param name="status">连接状态</param>
    /// <param name="strText">对应显示文本</param>
    /// <returns>旧文本</returns>
    public string SetConnectionStatusText(ConnectionStatus status, string strText);

# STNodeAttribute

## Properties

Name | Type | Description
--- | --- | ---
Path | string | 获取STNode节点期望在树形控件的路径
Author | string | 获取STNode节点的作者名称
Mail | string | 获取STNode节点的作者邮箱
Link | string | 获取STNode节点的作者链接
Description | string | 获取STNode节点的描述信息

## Constructor

Constructor

    /// <summary>
    /// 构造一个STNode特性
    /// </summary>
    /// <param name="strPath">期望路径</param>
    public STNodeAttribute(string strPath) : this(strPath, null, null, null, null);

Constructor

    /// <summary>
    /// 构造一个STNode特性
    /// </summary>
    /// <param name="strPath">期望路径</param>
    /// <param name="strDescription">描述信息</param>
    public STNodeAttribute(string strPath, string strDescription) : this(strPath, null, null, null, strDescription);

Constructor

    /// <summary>
    /// 构造一个STNode特性
    /// </summary>
    /// <param name="strPath">期望路径</param>
    /// <param name="strAuthor">STNode作者名称</param>
    /// <param name="strMail">STNode作者邮箱</param>
    /// <param name="strLink">STNode作者链接</param>
    /// <param name="strDescription">STNode节点描述信息</param>
    public STNodeAttribute(string strPath, string strAuthor, string strMail, string strLink, string strDescription);

# STNodePropertyAttribute

## Properties

Name | Type | Description
--- | --- | ---
Name | string | 获取属性需要在属性编辑器上显示的名称
Description | string | 获取属性需要在属性编辑器上显示的描述
DescriptorType | Type | 获取属性描述器类型

## Constructor

Constructor

    /// <summary>
    /// 构造一个STNode属性特性
    /// </summary>
    /// <param name="strKey">需要显示的名称</param>
    /// <param name="strDesc">需要显示的描述信息</param>
    public STNodePropertyAttribute(string strKey, string strDesc);

# STNodePropertyDescriptor

## Properties

Name | Type | Description
--- | --- | ---
Node | STNode | 获取目标节点
Control | STNodePropertyGrid | 获取所属的节点属性编辑器控件
Rectangle | Rectangle | 获取选项所在区域
RectangleL | Rectangle | 获取选项名称所在区域
RectangleR | Rectangle | 获取选项值所在区域
Name | string | 获取选项需要显示的名称
Description | string | 获取属性对应的描述信息
PropertyInfo | PropertyInfo | 获取属性信息

## Virtual method

OnSetItemLocation

    /// <summary>
    /// 当确定STNode属性在属性编辑器上的位置时候发生
    /// </summary>
    protected internal virtual void OnSetItemLocation();

GetValueFromString

    /// <summary>
    /// 将字符串形式的属性值转换为属性目标类型的值
    /// 默认只支持 int float double string bool 以及上述类型的Array
    /// 若目标类型不在上述中 请重写此函数自行转换
    /// </summary>
    /// <param name="strText">字符串形式的属性值</param>
    /// <returns>属性真实目标类型的值</returns>
    protected internal virtual object GetValueFromString(string strText);

GetStringFromValue

    /// <summary>
    /// 将属性目标类型的值转换为字符串形式的值
    /// 默认对类型值进行 ToString() 操作
    /// 如需特殊处理 请重写此函数自行转换
    /// </summary>
    /// <returns>属性值的字符串形式</returns>
    protected internal virtual string GetStringFromValue();

GetValueFromBytes

    /// <summary>
    /// 将二进制形式的属性值转换为属性目标类型的值 用于从文件存储中的数据还原属性值
    /// 默认将其转换为字符串然后调用 GetValueFromString(string)
    /// 此函数与 GetBytesFromValue() 相对应 若需要重写函数应当两个函数一起重写
    /// </summary>
    /// <param name="byData">二进制数据</param>
    /// <returns>属性真实目标类型的值</returns>
    protected internal virtual object GetValueFromBytes(byte[] byData);

GetBytesFromValue

    /// <summary>
    /// 将属性目标类型的值转换为二进制形式的值 用于文件存储时候调用
    /// 默认调用 GetStringFromValue() 然后将字符串转换为二进制数据
    /// 如需特殊处理 请重写此函数自行转换 并且重写 GetValueFromBytes()
    /// </summary>
    /// <returns>属性值的二进制形式</returns>
    protected internal virtual byte[] GetBytesFromValue();

GetValue

    /// <summary>
    /// 此函数对应 System.Reflection.PropertyInfo.GetValue()
    /// </summary>
    /// <param name="index">索引属性的可选索引值 对于非索引属性 此值应为null</param>
    /// <returns>属性值</returns>
    protected internal virtual object GetValue(object[] index);

SetValue

    /// <summary>
    /// 此函数对应 System.Reflection.PropertyInfo.SetValue()
    /// </summary>
    /// <param name="value">需要设置的属性值</param>
    protected internal virtual void SetValue(object value);

SetValue

    /// <summary>
    /// 此函数对应 System.Reflection.PropertyInfo.SetValue()
    /// 在调用之前会默认进行 GetValueFromString(strValue) 处理
    /// </summary>
    /// <param name="strValue">需要设置的属性字符串形式的值</param>
    protected internal virtual void SetValue(string strValue);

SetValue

    /// <summary>
    /// 此函数对应 System.Reflection.PropertyInfo.SetValue()
    /// 在调用之前会默认进行 GetValueFromBytes(byte[]) 处理
    /// </summary>
    /// <param name="byData">需要设置的属性二进制数据</param>
    protected internal virtual void SetValue(byte[] byData);

SetValue

    /// <summary>
    /// 此函数对应 System.Reflection.PropertyInfo.SetValue()
    /// </summary>
    /// <param name="value">需要设置的属性值</param>
    /// <param name="index">索引属性的可选索引值 对于非索引属性 此值应为null</param>
    protected internal virtual void SetValue(object value, object[] index);

SetValue

    /// <summary>
    /// 此函数对应 System.Reflection.PropertyInfo.SetValue()
    /// 在调用之前会默认进行 GetValueFromString(strValue) 处理
    /// </summary>
    /// <param name="strValue">需要设置的属性字符串形式的值</param>
    /// <param name="index">索引属性的可选索引值 对于非索引属性 此值应为null</param>
    protected internal virtual void SetValue(string strValue, object[] index);

SetValue

    /// <summary>
    /// 此函数对应 System.Reflection.PropertyInfo.SetValue()
    /// 在调用之前会默认进行 GetValueFromBytes(byte[]) 处理
    /// </summary>
    /// <param name="byData">需要设置的属性二进制数据</param>
    /// <param name="index">索引属性的可选索引值 对于非索引属性 此值应为null</param>
    protected internal virtual void SetValue(byte[] byData, object[] index);

OnSetValueError

    /// <summary>
    /// 当设置属性值发生错误时候发生
    /// </summary>
    /// <param name="ex">异常信息</param>
    protected internal virtual void OnSetValueError(Exception ex);

OnDrawValueRectangle

    /// <summary>
    /// 当绘制属性在属性编辑器上的值所在区域时候发生
    /// </summary>
    /// <param name="dt">绘制工具</param>
    protected internal virtual void OnDrawValueRectangle(DrawingTools dt);

OnMouseEnter

    /// <summary>
    /// 当鼠标进入属性值所在区域时候发生
    /// </summary>
    /// <param name="e">事件参数</param>
    protected internal virtual void OnMouseEnter(EventArgs e);

OnMouseDown

    /// <summary>
    /// 当鼠标在属性值所在区域点击时候发生
    /// </summary>
    /// <param name="e">事件参数</param>
    protected internal virtual void OnMouseDown(MouseEventArgs e);

OnMouseMove

    /// <summary>
    /// 当鼠标在属性值所在区域移动时候发生
    /// </summary>
    /// <param name="e">事件参数</param>
    protected internal virtual void OnMouseMove(MouseEventArgs e);

OnMouseUp

    /// <summary>
    /// 当鼠标在属性值所在区域抬起时候发生
    /// </summary>
    /// <param name="e">事件参数</param>
    protected internal virtual void OnMouseUp(MouseEventArgs e);

OnMouseLeave

    /// <summary>
    /// 当鼠标在属性值所在区域离开时候发生
    /// </summary>
    /// <param name="e">事件参数</param>
    protected internal virtual void OnMouseLeave(EventArgs e);

OnMouseClick

    /// <summary>
    /// 当鼠标在属性值所在区域点击时候发生
    /// </summary>
    /// <param name="e">事件参数</param>
    protected internal virtual void OnMouseClick(MouseEventArgs e);

## public method

Invalidate

    /// <summary>
    /// 重绘选项区域
    /// </summary>
    public void Invalidate();