From 4fa4831c3ade08c1081201cd1b946a79e247f9b9 Mon Sep 17 00:00:00 2001
From: zengwenjie <1663900244@qq.com>
Date: Fri, 19 Sep 2025 20:25:20 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84ReadyTo=E7=9A=84=E9=80=BB?=
 =?UTF-8?q?=E8=BE=91=E8=AE=BE=E8=AE=A1=EF=BC=8C=E4=BB=A3=E7=A0=81=E5=B0=9A?=
 =?UTF-8?q?=E6=9C=AA=E7=BC=96=E5=86=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
 DeedyDesigner/Deedy.Activity/ActionViewer.cs  |   6 +-
 DeedyDesigner/Deedy.Activity/BasalAction.cs   |  20 ++++
 .../Deedy.Activity/DeedyVisual/DeedyLayout.cs |  21 ++++
 .../Deedy.Activity/Helpers/ActionHelper.cs    |   3 +-
 .../Deedy.Activity/Helpers/ElementHelper.cs   | 103 ++++++++++++++++++
 DeedyDesigner/Deedy.Activity/IActivity.cs     |   2 +-
 DeedyDesigner/Deedy.Activity/IElement.cs      |  83 ++------------
 7 files changed, 161 insertions(+), 77 deletions(-)
diff --git a/DeedyDesigner/Deedy.Activity/ActionViewer.cs b/DeedyDesigner/Deedy.Activity/ActionViewer.cs
index 801f852..d707464 100644
--- a/DeedyDesigner/Deedy.Activity/ActionViewer.cs
+++ b/DeedyDesigner/Deedy.Activity/ActionViewer.cs
@@ -618,7 +618,7 @@ namespace Deedy.Activity
                     if (withExitline.ExitlinePosition.HasFlag(ExitlinePosition.Rightlower))
                         this.ShowRightExitline = Visibility.Visible;
                     // 新元素被托管渲染后调整子元素退出线位置
-                    withExitline.Help_AdjustExitlinePosition();
+                    withExitline.Help_ExitlinePositionAdjust();
                 }
 
                 if (newValue is ILogicController logicController)
@@ -646,7 +646,7 @@ namespace Deedy.Activity
                 this.ElementCount = combined.Elements.Count;
             }
             // 节点集合变更时调整退出线位置
-            if (this.ActionElement is IContainerWithExitline container) container.Help_AdjustExitlinePosition();
+            if (this.ActionElement is IContainerWithExitline container) container.Help_ExitlinePositionAdjust();
         }
 
         protected virtual void ActionElement_PropertyChanged(object? sender, PropertyChangedEventArgs e)
@@ -662,7 +662,7 @@ namespace Deedy.Activity
                     break;
                 case nameof(IContainerWithExitline.ExitlinePosition):
                     // 自身退出线变更时调整所有子节点退出线位置
-                    (this.ActionElement as IContainerWithExitline)?.Help_AdjustExitlinePosition();
+                    (this.ActionElement as IContainerWithExitline)?.Help_ExitlinePositionAdjust();
                     break;
                 default: break;
             }
diff --git a/DeedyDesigner/Deedy.Activity/BasalAction.cs b/DeedyDesigner/Deedy.Activity/BasalAction.cs
index 89c4dd0..3594e09 100644
--- a/DeedyDesigner/Deedy.Activity/BasalAction.cs
+++ b/DeedyDesigner/Deedy.Activity/BasalAction.cs
@@ -91,5 +91,25 @@ namespace Deedy.Activity
         {
             throw new NotImplementedException();
         }
+
+        public void LinkTo([AllowNull] IElement element)
+        {
+            throw new NotImplementedException();
+        }
+
+        public void Unlink()
+        {
+            throw new NotImplementedException();
+        }
+
+        public IElement? Clone()
+        {
+            throw new NotImplementedException();
+        }
+
+        public bool TryEncode(out string document)
+        {
+            throw new NotImplementedException();
+        }
     }
 }
diff --git a/DeedyDesigner/Deedy.Activity/DeedyVisual/DeedyLayout.cs b/DeedyDesigner/Deedy.Activity/DeedyVisual/DeedyLayout.cs
index b9509aa..bd6ec75 100644
--- a/DeedyDesigner/Deedy.Activity/DeedyVisual/DeedyLayout.cs
+++ b/DeedyDesigner/Deedy.Activity/DeedyVisual/DeedyLayout.cs
@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.ComponentModel;
+using System.Diagnostics.CodeAnalysis;
 using System.Linq;
 using System.Runtime.CompilerServices;
 using System.Text;
@@ -103,5 +104,25 @@ namespace Deedy.Activity
         {
             throw new NotImplementedException();
         }
+
+        public void LinkTo([AllowNull] IElement element)
+        {
+            throw new NotImplementedException();
+        }
+
+        public void Unlink()
+        {
+            throw new NotImplementedException();
+        }
+
+        public IElement? Clone()
+        {
+            throw new NotImplementedException();
+        }
+
+        public bool TryEncode(out string document)
+        {
+            throw new NotImplementedException();
+        }
     }
 }
diff --git a/DeedyDesigner/Deedy.Activity/Helpers/ActionHelper.cs b/DeedyDesigner/Deedy.Activity/Helpers/ActionHelper.cs
index b10e8ea..9c4f098 100644
--- a/DeedyDesigner/Deedy.Activity/Helpers/ActionHelper.cs
+++ b/DeedyDesigner/Deedy.Activity/Helpers/ActionHelper.cs
@@ -228,13 +228,12 @@ namespace Deedy.Activity
         public static void Help_RemoveFromParent(this IElement element)
         {
             if (element != null && element.ParentElement is IContainerElement container) container.Remove(element);
-            //TODO:将当前节点从自身的父级节点中移除
         }
         /// 
         /// 调整子节点的退出线位置
         /// 
         /// 要调整的带退出线容器
-        public static void Help_AdjustExitlinePosition(this IContainerWithExitline container)
+        public static void Help_ExitlinePositionAdjust(this IContainerWithExitline container)
         {
             if (container != null
                 && (container.ExitlinePosition == ExitlinePosition.LeftLower
diff --git a/DeedyDesigner/Deedy.Activity/Helpers/ElementHelper.cs b/DeedyDesigner/Deedy.Activity/Helpers/ElementHelper.cs
index c47fc1b..4432ad4 100644
--- a/DeedyDesigner/Deedy.Activity/Helpers/ElementHelper.cs
+++ b/DeedyDesigner/Deedy.Activity/Helpers/ElementHelper.cs
@@ -1,10 +1,12 @@
 using System;
 using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
 using System.Linq;
 using System.Reflection;
 using System.Runtime.CompilerServices;
 using System.Text;
 using System.Threading.Tasks;
+using System.Windows.Markup;
 
 namespace Deedy.Activity
 {
@@ -134,5 +136,106 @@ namespace Deedy.Activity
             }
             return result;
         }
+        /// 
+        /// 构建结构树,设置层级:并且完成参数映射的刷新
+        /// 
+        /// 父级元素
+        public static void Help_Element_ReadyToWorking(this IElement @this, IElement? parent = null, Output? output = null)
+        {
+            @this.LinkTo(parent);
+            if (@this is ICombinedElement combined)
+            {
+                combined.Help_CombineElements();
+                foreach (IElement subElement in combined.Elements)
+                    subElement.ReadyToWorking(@this);
+            }
+        }
+        public static void Help_Element_ReadyToEditing(this IElement @this, Runtime runtime)
+        {
+            if (@this is null) return;
+            @this.SetNamedPropertyValue(nameof(IActivity.Runtime), runtime);
+            if (@this is ICombinedElement combined)
+            {
+                combined.Help_BuildParamMapping();
+                foreach (var subElement in combined.Elements)
+                    subElement.ReadyToEditing(runtime);
+            }
+        }
+        /// 
+        /// 将当前节点链接到一个节点上
+        /// 
+        /// 要链接到的节点
+        public static void LinkTo(this IElement @this, [AllowNull] IElement element)
+        {
+            if (@this == null) return;
+
+            if (element == null)
+            {
+                @this.Unlink();
+                return;
+            }
+            if (@this.ParentElement != null)
+            {
+                if (@this.ParentElement == element) return;
+                else
+                {
+                    if (@this.ParentElement is IContainerElement container)
+                    {
+                        //this.SetNamedPropertyValue(nameof(ParentElement), element);
+                        @this.Help_Setter_ParentElement(element);
+                    }
+                }
+            }
+            else
+            {
+                //this.SetNamedPropertyValue(nameof(ParentElement), element);
+                @this.Help_Setter_ParentElement(element);
+            }
+            //this.SetNamedPropertyValue(nameof(DepthLevel), (this.ParentElement?.DepthLevel ?? 0) + 1);
+            @this.Help_Setter_DepthLevel((@this.ParentElement?.DepthLevel ?? 0) + 1);
+        }
+        /// 
+        /// 断开自身与父级节点的链接关系
+        /// 
+        public static void Unlink(this IElement @this)
+        {
+            if (@this == null) return;
+
+            //this.SetNamedPropertyValue(nameof(ParentElement), null);
+            @this.Help_Setter_ParentElement(null);
+            //this.SetNamedPropertyValue(nameof(DepthLevel), 0);
+            @this.Help_Setter_DepthLevel(0);
+        }
+        /// 
+        /// 克隆一个「IElement」节点
+        /// 
+        /// 要复制的节点
+        /// 如果复制失败则返回「null」
+        public static IElement? Clone(this IElement @this)
+        {
+            if (@this == null) return null;
+            try
+            {
+                return XamlReader.Parse(XamlWriter.Save(@this)) as IElement;
+            }
+            catch { return null; }
+        }
+        /// 
+        /// 尝试将一个「IElement」元素序列化为一个字符串形式档案
+        /// 
+        /// 要序列化的元素
+        /// 序列化后的文本文档
+        /// 如果出错则返回「Flase」
+        public static bool TryEncode(this IElement @this, out string document)
+        {
+            bool result = false;
+            try
+            {
+                document = XamlWriter.Save(@this);
+                result = true;
+            }
+            catch { document = string.Empty; }
+            return result;
+        }
     }
 }
diff --git a/DeedyDesigner/Deedy.Activity/IActivity.cs b/DeedyDesigner/Deedy.Activity/IActivity.cs
index f991fb5..359c948 100644
--- a/DeedyDesigner/Deedy.Activity/IActivity.cs
+++ b/DeedyDesigner/Deedy.Activity/IActivity.cs
@@ -10,7 +10,7 @@ namespace Deedy.Activity
     public interface IActivity
     {
         public Runtime? Runtime { get; }
-        public void ReadyToWorking(IElement? element = null, Output? output = null);
+        public void ReadyToWorking(IElement? parent = null, Output? output = null);
         public void ReadyToEditing(Runtime runtime);
         public void ReadyToRunning(Runtime runtime);
         public WorkMode WorkMode => Runtime?.WorkMode ?? WorkMode.Waiting;
diff --git a/DeedyDesigner/Deedy.Activity/IElement.cs b/DeedyDesigner/Deedy.Activity/IElement.cs
index ea2c94e..c490797 100644
--- a/DeedyDesigner/Deedy.Activity/IElement.cs
+++ b/DeedyDesigner/Deedy.Activity/IElement.cs
@@ -10,6 +10,14 @@ using System.Windows.Markup;
 
 namespace Deedy.Activity
 {
+    /// 
+    /// 所有可「设计」元素的公共接口
+    /// 注意:
+    /// 「LinkTo」与「Unlink」方法只处理父子级关系映射,不处理「Elements」集合的添加与删除...
+    /// 「ReadyToWorking」方法会先进行「LinkTo」再进行「CombineElements」操作...
+    /// 「ReadyToEditing」方法会迭代进行「BuildParamMapping」操作...
+    /// 「ReadyToRunning」方法会迭代进行「CheckLogicConfigs」操作...
+    /// 
     public interface IElement : IActivity, INotifyPropertyChanged
     {
         public string Class { get; }
@@ -25,80 +33,13 @@ namespace Deedy.Activity
         /// 将当前节点链接到一个节点上
         /// 
         /// 要链接到的节点
-        public virtual void LinkTo([AllowNull] IElement element)
-        {
-            if (element == null)
-            {
-                this.Unlink();
-                return;
-            }
-            if (this.ParentElement != null)
-            {
-                if (this.ParentElement == element) return;
-                else
-                {
-                    if (this.ParentElement is IContainerElement container)
-                    {
-                        container.Remove(this);
-                        container.Append(this);
-                        //this.SetNamedPropertyValue(nameof(ParentElement), element);
-                        this.Help_Setter_ParentElement(element);
-                    }
-                }
-            }
-            else
-            {
-                //this.SetNamedPropertyValue(nameof(ParentElement), element);
-                this.Help_Setter_ParentElement(element);
-            }
-            //this.SetNamedPropertyValue(nameof(DepthLevel), (this.ParentElement?.DepthLevel ?? 0) + 1);
-            this.Help_Setter_DepthLevel((this.ParentElement?.DepthLevel ?? 0) + 1);
-        }
+        public void LinkTo([AllowNull] IElement element);
         /// 
         /// 断开自身与父级节点的链接关系
         /// 
-        public virtual void Unlink()
-        {
-            (this.ParentElement as IContainerElement)?.Remove(this);
-            //this.SetNamedPropertyValue(nameof(ParentElement), null);
-            this.Help_Setter_ParentElement(null);
-            //this.SetNamedPropertyValue(nameof(DepthLevel), 0);
-            this.Help_Setter_DepthLevel(0);
-        }
-        /// 
-        /// 构建结构树,设置层级:并且完成参数映射的刷新
-        /// 
-        /// 
-        public new void ReadyToWorking(IElement? element = null, Output? output = null)
-        {
-            this.Help_BuildParamMapping(output);
-            if (element is ICombinedElement combinedElement)
-                combinedElement.Help_CombineElements();
-
-            this.LinkTo(element);
-            if (this is ICombinedElement combined)
-                foreach (IElement subElement in combined.Elements)
-                    subElement.ReadyToWorking(this);
-        }
-        public virtual IElement? Clone()
-        {
-            try
-            {
-                return XamlReader.Parse(XamlWriter.Save(this)) as IElement;
-            }
-            catch { return null; }
-        }
-        public virtual bool TryEncode(out string document)
-        {
-            bool result = false;
-            try
-            {
-                document = XamlWriter.Save(this);
-                result = true;
-            }
-            catch { document = string.Empty; }
-            return result;
-        }
+        public void Unlink();
+        public IElement? Clone();
+        public bool TryEncode(out string document);
         public static virtual bool TryDecode(string document, out IElement? element)
         {
             IElement? instance = null;