From 1e9812dd005f4f23fdb1a3d23b66b6ded2b2b8af Mon Sep 17 00:00:00 2001 From: zengwenjie <1663900244@qq.com> Date: Fri, 19 Sep 2025 19:33:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=B2=E7=BB=8F=E5=AE=8C=E6=88=90=E5=B8=A6?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E7=BB=84=E8=A3=85=E7=BB=84=E5=90=88=E5=8A=A8?= =?UTF-8?q?=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Deedy.Activity/Helpers/ActionHelper.cs | 53 +++++++++++-------- DeedyDesigner/Deedy.Activity/IElement.cs | 4 +- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/DeedyDesigner/Deedy.Activity/Helpers/ActionHelper.cs b/DeedyDesigner/Deedy.Activity/Helpers/ActionHelper.cs index 49a2477..b10e8ea 100644 --- a/DeedyDesigner/Deedy.Activity/Helpers/ActionHelper.cs +++ b/DeedyDesigner/Deedy.Activity/Helpers/ActionHelper.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; +using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; using System.Windows; @@ -129,38 +130,48 @@ namespace Deedy.Activity /// /// 将使用部件声明特性声明的动作部件与主体组装到一起并连接 /// - /// + /// 要进行组装的组合元素 public static void Help_CombineElements(this ICombinedElement combined) { if (combined == null) return; if (combined.Elements == null) combined.Elements = []; var props = combined.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.SetField); + SortedList sortedElements = new(); + Dictionary properties = new(); foreach (var prop in props) { - if (prop.CanWrite && prop.CanRead) - { - if (!prop.PropertyType.IsAssignableFrom(typeof(IElement))) continue; + if (!prop.CanRead || !prop.CanWrite) continue; + if (!prop.PropertyType.IsAssignableFrom(typeof(IElement))) continue; + var cpd = prop.GetCustomAttribute(); + if (cpd == null) continue; + var element = prop.GetValue(combined) as IElement; + if (element == null) continue; - bool hasPart = false; - foreach (var element in combined.Elements) + element.Help_SetAttachValue(CombinePartActionAttribute.CombinePartSign, prop.Name); + sortedElements.Add(cpd.InitialSort, element); + properties.Add(prop.Name, prop); + } + foreach (var partElement in sortedElements.Values) + { + string partSign = partElement.Help_GetAttachValue(CombinePartActionAttribute.CombinePartSign); + if (string.IsNullOrEmpty(partSign)) continue; + bool hasPart = false; + foreach (var element in combined.Elements) + { + if (element.Help_GetAttachValue(CombinePartActionAttribute.CombinePartSign) == partSign) { - if (element.Help_GetAttachValue(CombinePartActionAttribute.CombinePartSign) == prop.Name) - { - element.LinkTo(combined); - prop.SetValue(combined, element); - hasPart = true; - break; - } - } - if (!hasPart) - { - IElement? partElement = prop.GetValue(combined) as IElement; - if (partElement == null) continue; - combined.Elements.Add(partElement); - partElement.LinkTo(combined); - partElement.Help_SetAttachValue(CombinePartActionAttribute.CombinePartSign, prop.Name); + element.LinkTo(combined); + properties[partSign].SetValue(combined, element); + hasPart = true; + break; } } + if (!hasPart) + { + combined.Elements.Add(partElement); + partElement.LinkTo(combined); + if (partElement is IActionElement actionElement) actionElement.IsLocked = true; + } } } /// diff --git a/DeedyDesigner/Deedy.Activity/IElement.cs b/DeedyDesigner/Deedy.Activity/IElement.cs index d5bbc06..ea2c94e 100644 --- a/DeedyDesigner/Deedy.Activity/IElement.cs +++ b/DeedyDesigner/Deedy.Activity/IElement.cs @@ -76,8 +76,8 @@ namespace Deedy.Activity combinedElement.Help_CombineElements(); this.LinkTo(element); - if (this is IContainerElement container) - foreach (IElement subElement in container.Elements) + if (this is ICombinedElement combined) + foreach (IElement subElement in combined.Elements) subElement.ReadyToWorking(this); } public virtual IElement? Clone()