diff --git a/DeedyDesigner/Deedy.Design/Collection/DeedyElementCollection.cs b/DeedyDesigner/Deedy.Design/Collection/DeedyElementCollection.cs new file mode 100644 index 0000000..ea1eb80 --- /dev/null +++ b/DeedyDesigner/Deedy.Design/Collection/DeedyElementCollection.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Deedy.Design +{ + public class DeedyElementCollection : ObservableCollection + { + public DeedyElementCollection() : this(false) { } + public DeedyElementCollection(bool needDistinct = false) + { + this._needDistinct = needDistinct; + } + private bool _needDistinct = false; + public void AddRange(params IDeedyElement[] elements) + { + foreach (var element in elements) this.Add(element); + } + public void AddRange([AllowNull] IEnumerable elements) + { + if (elements != null) foreach (var element in elements) this.Add(element); + } + public new void Add([AllowNull] IDeedyElement element) + { + if (element == null) return; + if (this._needDistinct) + { + foreach (var item in this.Items) + { + if (element.DEClass == item.DEClass && element.DETitle == item.DETitle) return; + } + } + base.Add(element); + } + } +} diff --git a/DeedyDesigner/Deedy.Design/DeedyAction.cs b/DeedyDesigner/Deedy.Design/DeedyAction.cs new file mode 100644 index 0000000..ccad2fb --- /dev/null +++ b/DeedyDesigner/Deedy.Design/DeedyAction.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace Deedy.Design +{ + public abstract class DeedyAction : IDeedyAction + { + public string DEClass { get; protected internal set; } = ""; + public string DETitle { get; set; } = ""; + public string DERemark { get; set; } = ""; + public string DEIdentify { get; set; } = ""; + public IDeedyElement? DeedyParent { get; protected internal set; } + public IDeedyViewer? DeedyViewer { get; protected internal set; } + + public event PropertyChangedEventHandler? PropertyChanged; + + /// + /// 发送属性变更通知 + /// + /// 发生变更的属性 + protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + /// + /// 读取一个字段的值 + /// + /// 值的类型,可以通过参数进行自动判定 + /// 字段的引用【注意:此参数通过引用传递】 + /// 属性名称;如果在属性的读取访问器中调用可以自动注入 + /// 字段中的值 + protected virtual T GetField(ref T field, [CallerMemberName] string? propertyName = null) + { + return field; + } + /// + /// 检查新值是否与原值相等,如果不相等便赋值并发出通知 + /// + /// 值的类型,可以通过参数进行自动判定 + /// 字段的引用【注意:此参数通过引用传递】 + /// 字段的新值 + /// 要进行变更通知的属性名称;如果在属性的设置访问器中调用可以自动注入 + /// 值是否有变更 + protected virtual bool SetField(ref T field, T value, [CallerMemberName] string? propertyName = null) + { + if (EqualityComparer.Default.Equals(field, value)) return false; + field = value; + OnPropertyChanged(propertyName); + return true; + } + } +} diff --git a/DeedyDesigner/Deedy.Design/DeedyHelper.cs b/DeedyDesigner/Deedy.Design/DeedyHelper.cs new file mode 100644 index 0000000..e6d952c --- /dev/null +++ b/DeedyDesigner/Deedy.Design/DeedyHelper.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Deedy.Design +{ + public static class DeedyHelper + { + } +} diff --git a/DeedyDesigner/Deedy.Design/DeedyUIProxy.cs b/DeedyDesigner/Deedy.Design/DeedyUIProxy.cs new file mode 100644 index 0000000..2523b72 --- /dev/null +++ b/DeedyDesigner/Deedy.Design/DeedyUIProxy.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace Deedy.Design +{ + public class DeedyUIProxy : IDeedyVisual + { + private readonly IDeedyVisual _Visual; + public DeedyUIProxy(IDeedyVisual visual) { this._Visual = visual; } + public string DEClass { get; protected internal set; } = ""; + public string DETitle { get; set; } = ""; + public string DERemark { get; set; } = ""; + public string DEIdentify { get; set; } = ""; + public IDeedyElement? DeedyParent { get; protected internal set; } + + public event PropertyChangedEventHandler? PropertyChanged; + + /// + /// 发送属性变更通知 + /// + /// 发生变更的属性 + protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + /// + /// 读取一个字段的值 + /// + /// 值的类型,可以通过参数进行自动判定 + /// 字段的引用【注意:此参数通过引用传递】 + /// 属性名称;如果在属性的读取访问器中调用可以自动注入 + /// 字段中的值 + protected virtual T GetField(ref T field, [CallerMemberName] string? propertyName = null) + { + //TODO:这里处理内部属性获取逻辑(包括运行时参数映射逻辑) + return field; + } + /// + /// 检查新值是否与原值相等,如果不相等便赋值并发出通知 + /// + /// 值的类型,可以通过参数进行自动判定 + /// 字段的引用【注意:此参数通过引用传递】 + /// 字段的新值 + /// 要进行变更通知的属性名称;如果在属性的设置访问器中调用可以自动注入 + /// 值是否有变更 + protected virtual bool SetField(ref T field, T value, [CallerMemberName] string? propertyName = null) + { + if (EqualityComparer.Default.Equals(field, value)) return false; + //TODO:这里处理内部属性变更逻辑(包括运行时参数映射逻辑) + field = value; + OnPropertyChanged(propertyName); + return true; + } + } +} diff --git a/DeedyDesigner/Deedy.Design/DeedyViewer.cs b/DeedyDesigner/Deedy.Design/DeedyViewer.cs index 6a600cd..948fbcf 100644 --- a/DeedyDesigner/Deedy.Design/DeedyViewer.cs +++ b/DeedyDesigner/Deedy.Design/DeedyViewer.cs @@ -1,6 +1,9 @@ using System; using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics.CodeAnalysis; using System.Linq; +using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; using System.Windows; @@ -44,11 +47,65 @@ namespace Deedy.Design /// /// /// - public class DeedyViewer : Control + public class DeedyViewer : Control, IDeedyViewer { static DeedyViewer() { DefaultStyleKeyProperty.OverrideMetadata(typeof(DeedyViewer), new FrameworkPropertyMetadata(typeof(DeedyViewer))); } + + public event PropertyChangedEventHandler? PropertyChanged; + + /// + /// 发送属性变更通知 + /// + /// 发生变更的属性 + protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + /// + /// 读取一个字段的值 + /// + /// 值的类型,可以通过参数进行自动判定 + /// 字段的引用【注意:此参数通过引用传递】 + /// 属性名称;如果在属性的读取访问器中调用可以自动注入 + /// 字段中的值 + protected virtual T GetField(ref T field, [CallerMemberName] string? propertyName = null) + { + return field; + } + /// + /// 检查新值是否与原值相等,如果不相等便赋值并发出通知 + /// + /// 值的类型,可以通过参数进行自动判定 + /// 字段的引用【注意:此参数通过引用传递】 + /// 字段的新值 + /// 要进行变更通知的属性名称;如果在属性的设置访问器中调用可以自动注入 + /// 值是否有变更 + protected virtual bool SetField(ref T field, T value, [CallerMemberName] string? propertyName = null) + { + if (EqualityComparer.Default.Equals(field, value)) return false; + field = value; + OnPropertyChanged(propertyName); + return true; + } + + [AllowNull, DefaultValue(null)] + /// + /// 动作节点 + /// + public IDeedyAction DeedyAction + { + get { return (IDeedyAction)GetValue(DeedyActionProperty); } + set { SetValue(DeedyActionProperty, value); } + } + public static readonly DependencyProperty DeedyActionProperty = + DependencyProperty.Register("DeedyAction", typeof(IDeedyAction), typeof(DeedyViewer), new PropertyMetadata(null, + (d, e) => (d as DeedyViewer)?.DeedyAction_PropertyChangedCallback(d, e))); + /// + /// 处理「DeedyActionViewer.DeedyAction」属性变更 + /// + protected virtual void DeedyAction_PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + + } } } diff --git a/DeedyDesigner/Deedy.Design/IDeedyAction.cs b/DeedyDesigner/Deedy.Design/IDeedyAction.cs new file mode 100644 index 0000000..66ba99f --- /dev/null +++ b/DeedyDesigner/Deedy.Design/IDeedyAction.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Deedy.Design +{ + public interface IDeedyAction : IDeedyElement + { + public IDeedyViewer? DeedyViewer { get; } + } +} diff --git a/DeedyDesigner/Deedy.Design/IDeedyElement.cs b/DeedyDesigner/Deedy.Design/IDeedyElement.cs new file mode 100644 index 0000000..106fdfe --- /dev/null +++ b/DeedyDesigner/Deedy.Design/IDeedyElement.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace Deedy.Design +{ + public interface IDeedyElement : INotifyPropertyChanged + { + public string DEClass { get; } + public string DETitle { get; set; } + public string DERemark { get; set; } + public string DEIdentify { get; set; } + public IDeedyElement? DeedyParent { get; } + + } +} diff --git a/DeedyDesigner/Deedy.Design/IDeedyViewer.cs b/DeedyDesigner/Deedy.Design/IDeedyViewer.cs new file mode 100644 index 0000000..7b7ca11 --- /dev/null +++ b/DeedyDesigner/Deedy.Design/IDeedyViewer.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Deedy.Design +{ + public interface IDeedyViewer : INotifyPropertyChanged + { + [AllowNull] + public IDeedyAction DeedyAction { get; set; } + } +} diff --git a/DeedyDesigner/Deedy.Design/IDeedyVisual.cs b/DeedyDesigner/Deedy.Design/IDeedyVisual.cs new file mode 100644 index 0000000..288a2cf --- /dev/null +++ b/DeedyDesigner/Deedy.Design/IDeedyVisual.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Deedy.Design +{ + public interface IDeedyVisual : IDeedyElement + { + } +}