/// <summary> 为节点设置内容布局样式 /// /// </summary> /// <param name="Struct">指示DataItem的数据结构</param> /// <param name="NodeContentParame">设置节点内容布局</param> public void SetNodeContent(MindMapNodeStructBase Struct, MindMapNodeContentBase NodeContentParame) { #region 为什么要有锁? /* * 锁的概念是为了调用本方法设置节点内容时,要将以前的节点内容的ParentMindMapNode属性设置为空 * 类似于Control类的Parent属性,使得节点容器和节点内容只需要修改其中一个实例另一个实例就会自动变 * 但是以前的节点内容的ParentMindMapNode属性也有相同的特性会返回来调用本方法,所以会造成死递归 */ #endregion 为什么要有锁? if (SetContentLock) { return; //锁打开了就直接返回 } SetContentLock = true; //打开锁 if (this._NodeContent == NodeContentParame) { return; } if (this._NodeContent != null) { this._NodeContent.NodeContainer = null; //把以前的置为空 } this._NodeContent = NodeContentParame; this.Content_Panel.Controls.Clear(); if (this._NodeContent != null) { this.NodeContent.DataStruct = Struct; this.Content_Panel.Controls.Add(this.NodeContent); this._NodeContent.NodeContainer = this; this._NodeContent.CurrentScaling = this.CurrentScaling; } ReSetSize(); SetContentLock = false;//关闭锁 if (AddNodeContent != null) { AddNodeContent(this, null); } }
/// <summary> 为节点设置内容布局样式 /// /// </summary> /// <typeparam name="NodeContentClass">指定该节点内容采用哪种布局</typeparam> /// <param name="Struct">指示DataItem的数据结构</param> public void SetNodeContent <NodeContentClass>(MindMapNodeStructBase Struct) where NodeContentClass : MindMapNodeContentBase, new() { SetNodeContent(Struct, new NodeContentClass()); }