完善ReadyTo的逻辑设计,代码尚未编写

This commit is contained in:
zengwenjie
2025-09-19 20:25:20 +08:00
parent 1e9812dd00
commit 4fa4831c3a
7 changed files with 161 additions and 77 deletions

View File

@@ -618,7 +618,7 @@ namespace Deedy.Activity
if (withExitline.ExitlinePosition.HasFlag(ExitlinePosition.Rightlower)) if (withExitline.ExitlinePosition.HasFlag(ExitlinePosition.Rightlower))
this.ShowRightExitline = Visibility.Visible; this.ShowRightExitline = Visibility.Visible;
// 新元素被托管渲染后调整子元素退出线位置 // 新元素被托管渲染后调整子元素退出线位置
withExitline.Help_AdjustExitlinePosition(); withExitline.Help_ExitlinePositionAdjust();
} }
if (newValue is ILogicController logicController) if (newValue is ILogicController logicController)
@@ -646,7 +646,7 @@ namespace Deedy.Activity
this.ElementCount = combined.Elements.Count; 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) protected virtual void ActionElement_PropertyChanged(object? sender, PropertyChangedEventArgs e)
@@ -662,7 +662,7 @@ namespace Deedy.Activity
break; break;
case nameof(IContainerWithExitline.ExitlinePosition): case nameof(IContainerWithExitline.ExitlinePosition):
// 自身退出线变更时调整所有子节点退出线位置 // 自身退出线变更时调整所有子节点退出线位置
(this.ActionElement as IContainerWithExitline)?.Help_AdjustExitlinePosition(); (this.ActionElement as IContainerWithExitline)?.Help_ExitlinePositionAdjust();
break; break;
default: break; default: break;
} }

View File

@@ -91,5 +91,25 @@ namespace Deedy.Activity
{ {
throw new NotImplementedException(); 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();
}
} }
} }

View File

@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Linq; using System.Linq;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Text; using System.Text;
@@ -103,5 +104,25 @@ namespace Deedy.Activity
{ {
throw new NotImplementedException(); 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();
}
} }
} }

View File

@@ -228,13 +228,12 @@ namespace Deedy.Activity
public static void Help_RemoveFromParent(this IElement element) public static void Help_RemoveFromParent(this IElement element)
{ {
if (element != null && element.ParentElement is IContainerElement container) container.Remove(element); if (element != null && element.ParentElement is IContainerElement container) container.Remove(element);
//TODO将当前节点从自身的父级节点中移除
} }
/// <summary> /// <summary>
/// 调整子节点的退出线位置 /// 调整子节点的退出线位置
/// </summary> /// </summary>
/// <param name="container">要调整的带退出线容器</param> /// <param name="container">要调整的带退出线容器</param>
public static void Help_AdjustExitlinePosition(this IContainerWithExitline container) public static void Help_ExitlinePositionAdjust(this IContainerWithExitline container)
{ {
if (container != null if (container != null
&& (container.ExitlinePosition == ExitlinePosition.LeftLower && (container.ExitlinePosition == ExitlinePosition.LeftLower

View File

@@ -1,10 +1,12 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Markup;
namespace Deedy.Activity namespace Deedy.Activity
{ {
@@ -134,5 +136,106 @@ namespace Deedy.Activity
} }
return result; return result;
} }
/// <summary>
/// 构建结构树,设置层级:并且完成参数映射的刷新
/// </summary>
/// <param name="parent">父级元素</param>
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<Runtime?>(nameof(IActivity.Runtime), runtime);
if (@this is ICombinedElement combined)
{
combined.Help_BuildParamMapping();
foreach (var subElement in combined.Elements)
subElement.ReadyToEditing(runtime);
}
}
/// <summary>
/// 将当前节点链接到一个节点上
/// </summary>
/// <param name="element">要链接到的节点</param>
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);
}
/// <summary>
/// 断开自身与父级节点的链接关系
/// </summary>
public static void Unlink(this IElement @this)
{
if (@this == null) return;
//this.SetNamedPropertyValue<IElement?>(nameof(ParentElement), null);
@this.Help_Setter_ParentElement(null);
//this.SetNamedPropertyValue(nameof(DepthLevel), 0);
@this.Help_Setter_DepthLevel(0);
}
/// <summary>
/// 克隆一个「IElement」节点
/// </summary>
/// <param name="this">要复制的节点</param>
/// <returns>如果复制失败则返回「null」</returns>
public static IElement? Clone(this IElement @this)
{
if (@this == null) return null;
try
{
return XamlReader.Parse(XamlWriter.Save(@this)) as IElement;
}
catch { return null; }
}
/// <summary>
/// 尝试将一个「IElement」元素序列化为一个字符串形式档案
/// </summary>
/// <param name="this">要序列化的元素</param>
/// <param name="document">序列化后的文本文档</param>
/// <returns>如果出错则返回「Flase」</returns>
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;
}
} }
} }

View File

@@ -10,7 +10,7 @@ namespace Deedy.Activity
public interface IActivity public interface IActivity
{ {
public Runtime? Runtime { get; } 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 ReadyToEditing(Runtime runtime);
public void ReadyToRunning(Runtime runtime); public void ReadyToRunning(Runtime runtime);
public WorkMode WorkMode => Runtime?.WorkMode ?? WorkMode.Waiting; public WorkMode WorkMode => Runtime?.WorkMode ?? WorkMode.Waiting;

View File

@@ -10,6 +10,14 @@ using System.Windows.Markup;
namespace Deedy.Activity namespace Deedy.Activity
{ {
/// <summary>
/// 所有可「设计」元素的公共接口
/// <para>注意:</para>
/// <para>「LinkTo」与「Unlink」方法只处理父子级关系映射不处理「Elements」集合的添加与删除...</para>
/// <para>「ReadyToWorking」方法会先进行「LinkTo」再进行「CombineElements」操作...</para>
/// <para>「ReadyToEditing」方法会迭代进行「BuildParamMapping」操作...</para>
/// <para>「ReadyToRunning」方法会迭代进行「CheckLogicConfigs」操作...</para>
/// </summary>
public interface IElement : IActivity, INotifyPropertyChanged public interface IElement : IActivity, INotifyPropertyChanged
{ {
public string Class { get; } public string Class { get; }
@@ -25,80 +33,13 @@ namespace Deedy.Activity
/// 将当前节点链接到一个节点上 /// 将当前节点链接到一个节点上
/// </summary> /// </summary>
/// <param name="element">要链接到的节点</param> /// <param name="element">要链接到的节点</param>
public virtual void LinkTo([AllowNull] IElement element) public 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);
}
/// <summary> /// <summary>
/// 断开自身与父级节点的链接关系 /// 断开自身与父级节点的链接关系
/// </summary> /// </summary>
public virtual void Unlink() public void Unlink();
{ public IElement? Clone();
(this.ParentElement as IContainerElement)?.Remove(this); public bool TryEncode(out string document);
//this.SetNamedPropertyValue<IElement?>(nameof(ParentElement), null);
this.Help_Setter_ParentElement(null);
//this.SetNamedPropertyValue(nameof(DepthLevel), 0);
this.Help_Setter_DepthLevel(0);
}
/// <summary>
/// 构建结构树,设置层级:并且完成参数映射的刷新
/// </summary>
/// <param name="parent"></param>
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 static virtual bool TryDecode(string document, out IElement? element) public static virtual bool TryDecode(string document, out IElement? element)
{ {
IElement? instance = null; IElement? instance = null;