mirror of
https://gitee.com/wang-yin1/wpf-visual-process-framework
synced 2026-03-02 15:50:51 +08:00
添加项目文件。
This commit is contained in:
26
VisionFrame.Base/Converter/BoolToBrushConverter.cs
Normal file
26
VisionFrame.Base/Converter/BoolToBrushConverter.cs
Normal file
@@ -0,0 +1,26 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Media;
|
||||
|
||||
namespace VisionFrame.Base.Converter
|
||||
{
|
||||
public class BoolToBrushConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if (bool.Parse(value.ToString()))
|
||||
return Brushes.LawnGreen;
|
||||
else return Brushes.ForestGreen;
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
30
VisionFrame.Base/Converter/LocationConverter.cs
Normal file
30
VisionFrame.Base/Converter/LocationConverter.cs
Normal file
@@ -0,0 +1,30 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace VisionFrame.Base.Converter
|
||||
{
|
||||
public class LocationConverter : IMultiValueConverter
|
||||
{
|
||||
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
double.TryParse(values[0].ToString(), out double w);
|
||||
double.TryParse(values[1].ToString(), out double h);
|
||||
|
||||
double w1 = w * 2;
|
||||
double h1 = h * 2;
|
||||
|
||||
return new Thickness((w - w1) / 2, (h - h1) / 2, 0, 0);
|
||||
}
|
||||
|
||||
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
54
VisionFrame.Base/Converter/NodeJsonConverter.cs
Normal file
54
VisionFrame.Base/Converter/NodeJsonConverter.cs
Normal file
@@ -0,0 +1,54 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace VisionFrame.Base.Converter
|
||||
{
|
||||
public class NodeJsonConverter : JsonConverter<NodeModelBase>
|
||||
{
|
||||
class TypeInfoTemp
|
||||
{
|
||||
public string TypeInfo { get; set; }
|
||||
}
|
||||
// 字符串到对象实例的转换过程
|
||||
public override NodeModelBase? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
||||
{
|
||||
string json = reader.GetString();// 包含程序信息
|
||||
|
||||
TypeInfoTemp ti = System.Text.Json.JsonSerializer.Deserialize<TypeInfoTemp>(json);
|
||||
string[] type_info = ti.TypeInfo.Split(";");
|
||||
Assembly assembly = Assembly.GetEntryAssembly();// 取当前执行的程序集
|
||||
if (assembly.GetName().Name != type_info[0])
|
||||
{
|
||||
assembly = Assembly.LoadFile(Environment.CurrentDirectory + "/Activities/" + type_info[0] + ".dll");
|
||||
}
|
||||
// 最终要执的节点Model
|
||||
Type type = assembly.GetType(type_info[1]);
|
||||
|
||||
NodeModelBase node = (NodeModelBase)System.Text.Json.JsonSerializer.Deserialize(json, type);
|
||||
return node;
|
||||
}
|
||||
|
||||
// 对象到Json字符串的转换过程
|
||||
public override void Write(Utf8JsonWriter writer, NodeModelBase value, JsonSerializerOptions options)
|
||||
{
|
||||
// value--->Json
|
||||
// writer--写
|
||||
// 准备类型的记录
|
||||
string type = value.GetType().FullName;
|
||||
string assembly = value.GetType().Assembly.GetName().Name;
|
||||
value.TypeInfo = assembly + ";" + type;
|
||||
|
||||
// 如果直接放value 会循环触发这个方法
|
||||
// 用一个动态变量接收,
|
||||
dynamic temp = value;
|
||||
string json = System.Text.Json.JsonSerializer.Serialize(temp);
|
||||
writer.WriteStringValue(json);
|
||||
}
|
||||
}
|
||||
}
|
||||
33
VisionFrame.Base/Converter/SizeConverter.cs
Normal file
33
VisionFrame.Base/Converter/SizeConverter.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace VisionFrame.Base.Converter
|
||||
{
|
||||
public class SizeConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
double r = 2;
|
||||
if (parameter != null)
|
||||
{
|
||||
double.TryParse(parameter.ToString(), out r);
|
||||
}
|
||||
// 实际的宽高值
|
||||
// 将这个值乘2返回出去
|
||||
if (value != null && double.TryParse(value.ToString(), out double new_value))
|
||||
return new_value * r;
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
51
VisionFrame.Base/Converter/StringToNodeConverter.cs
Normal file
51
VisionFrame.Base/Converter/StringToNodeConverter.cs
Normal file
@@ -0,0 +1,51 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace VisionFrame.Base.Converter
|
||||
{
|
||||
public class StringToNodeConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
string[] _info = value.ToString().Split(";");
|
||||
|
||||
Assembly assembly = Assembly.GetEntryAssembly();
|
||||
Type type = assembly.GetType(_info[0]);
|
||||
if (_info.Length == 2)
|
||||
{
|
||||
assembly =
|
||||
Assembly.LoadFile(Environment.CurrentDirectory + "/Activities/" + _info[0] + ".dll");
|
||||
if (assembly == null) return null;
|
||||
|
||||
type = assembly.GetType(_info[1]);
|
||||
if (type == null) return null;
|
||||
}
|
||||
|
||||
object instance = Activator.CreateInstance(type);
|
||||
|
||||
Binding binding = new Binding("DataContext.AnchorDownCommand");
|
||||
binding.RelativeSource = new RelativeSource() { AncestorType = typeof(ItemsControl) };
|
||||
(instance as NodeBase).SetBinding(NodeBase.AnchorDownCommandProperty, binding);
|
||||
|
||||
|
||||
binding = new Binding("DataContext.AnchorUpCommand");
|
||||
binding.RelativeSource = new RelativeSource() { AncestorType = typeof(ItemsControl) };
|
||||
(instance as NodeBase).SetBinding(NodeBase.AnchorUpCommandProperty, binding);
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
13
VisionFrame.Base/DecisionNodeModelBase.cs
Normal file
13
VisionFrame.Base/DecisionNodeModelBase.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace VisionFrame.Base
|
||||
{
|
||||
public class DecisionNodeModelBase : NodeModelBase
|
||||
{
|
||||
public virtual bool Decision(IFlowContext context) { return false; }
|
||||
}
|
||||
}
|
||||
17
VisionFrame.Base/IFlowContext.cs
Normal file
17
VisionFrame.Base/IFlowContext.cs
Normal file
@@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VisionFrame.Base.Models;
|
||||
|
||||
namespace VisionFrame.Base
|
||||
{
|
||||
public interface IFlowContext
|
||||
{
|
||||
public ObservableCollection<FlowArgModel> ArgumentList { get; set; }
|
||||
|
||||
void ShowImage(IntPtr imagePtr);
|
||||
}
|
||||
}
|
||||
15
VisionFrame.Base/Models/FlowArgModel.cs
Normal file
15
VisionFrame.Base/Models/FlowArgModel.cs
Normal file
@@ -0,0 +1,15 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace VisionFrame.Base.Models
|
||||
{
|
||||
public class FlowArgModel
|
||||
{
|
||||
public string ArgName { get; set; }
|
||||
public string ArgType { get; set; }
|
||||
public object Value { get; set; }
|
||||
}
|
||||
}
|
||||
38
VisionFrame.Base/Models/NodeArgModel.cs
Normal file
38
VisionFrame.Base/Models/NodeArgModel.cs
Normal file
@@ -0,0 +1,38 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace VisionFrame.Base.Models
|
||||
{
|
||||
public class NodeArgModel : INotifyPropertyChanged
|
||||
{
|
||||
public string ArgName { get; set; }
|
||||
public string ArgType { get; set; }
|
||||
public string Direction { get; set; }
|
||||
|
||||
private object _argValue;
|
||||
|
||||
public object ArgValue
|
||||
{
|
||||
get { return _argValue; }
|
||||
set
|
||||
{
|
||||
_argValue = value;
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("ArgValue"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 数据的获取方式
|
||||
// 0:选择流程参数,下拉列表
|
||||
// 1:输入框
|
||||
// 2:选择目录
|
||||
public int ValueMode { get; set; } = 0;
|
||||
|
||||
public event PropertyChangedEventHandler? PropertyChanged;
|
||||
}
|
||||
}
|
||||
55
VisionFrame.Base/NodeBase.cs
Normal file
55
VisionFrame.Base/NodeBase.cs
Normal file
@@ -0,0 +1,55 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace VisionFrame.Base
|
||||
{
|
||||
public class NodeBase : UserControl
|
||||
{
|
||||
//public ICommand AnchorDownCommand { get; set; }
|
||||
//public ICommand AnchorUpCommand { get; set; }
|
||||
|
||||
public ICommand AnchorDownCommand
|
||||
{
|
||||
get { return (ICommand)GetValue(AnchorDownCommandProperty); }
|
||||
set { SetValue(AnchorDownCommandProperty, value); }
|
||||
}
|
||||
public static readonly DependencyProperty AnchorDownCommandProperty =
|
||||
DependencyProperty.Register("AnchorDownCommand",
|
||||
typeof(ICommand), typeof(NodeBase), new PropertyMetadata(null));
|
||||
|
||||
|
||||
public ICommand AnchorUpCommand
|
||||
{
|
||||
get { return (ICommand)GetValue(AnchorUpCommandProperty); }
|
||||
set { SetValue(AnchorUpCommandProperty, value); }
|
||||
}
|
||||
public static readonly DependencyProperty AnchorUpCommandProperty =
|
||||
DependencyProperty.Register("AnchorUpCommand",
|
||||
typeof(ICommand), typeof(NodeBase), new PropertyMetadata(null));
|
||||
|
||||
|
||||
|
||||
public void Ellipse_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
this.AnchorDownCommand?.Execute(
|
||||
(this.DataContext as NodeModelBase).NodeId + ";" + (sender as Ellipse).Tag.ToString()
|
||||
);
|
||||
e.Handled = true;
|
||||
}
|
||||
|
||||
public void Ellipse_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
this.AnchorUpCommand?.Execute(
|
||||
(this.DataContext as NodeModelBase).NodeId + ";" + (sender as Ellipse).Tag.ToString()
|
||||
);
|
||||
e.Handled = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
143
VisionFrame.Base/NodeModelBase.cs
Normal file
143
VisionFrame.Base/NodeModelBase.cs
Normal file
@@ -0,0 +1,143 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Text.Json.Serialization;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Input;
|
||||
using VisionFrame.Base.Converter;
|
||||
using VisionFrame.Base.Models;
|
||||
|
||||
namespace VisionFrame.Base
|
||||
{
|
||||
// 解决序列化时多态对象的类型区分
|
||||
//[JsonPolymorphic(UnknownDerivedTypeHandling = JsonUnknownDerivedTypeHandling.FallBackToNearestAncestor)]
|
||||
//[JsonDerivedType(typeof(DecisionNodeModelBase), typeDiscriminator: "decision")]
|
||||
|
||||
// 对这类对象进么Json序列的时候 会执行Converter中的相关方法
|
||||
[JsonConverter(typeof(NodeJsonConverter))]
|
||||
public class NodeModelBase : INotifyPropertyChanged
|
||||
{
|
||||
public string TypeInfo { get; set; }
|
||||
public List<int> FlowLevel { get; set; } = new List<int>();
|
||||
// 每个节点实例 唯一编号
|
||||
public string NodeId { get; set; }
|
||||
public NodeModelBase()
|
||||
{
|
||||
NodeId = Guid.NewGuid().ToString();
|
||||
}
|
||||
|
||||
public string NodeName { get; set; }
|
||||
|
||||
public string TargetNodeObject { get; set; }
|
||||
|
||||
public bool IsStart { get; set; } = false;
|
||||
|
||||
public bool IsDecision { get; set; } = false;
|
||||
|
||||
private double _x;
|
||||
|
||||
public double X
|
||||
{
|
||||
get { return _x; }
|
||||
set
|
||||
{
|
||||
_x = value;
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(X)));
|
||||
}
|
||||
}
|
||||
private double _y;
|
||||
|
||||
public double Y
|
||||
{
|
||||
get { return _y; }
|
||||
set
|
||||
{
|
||||
_y = value;
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Y)));
|
||||
}
|
||||
}
|
||||
|
||||
public double W { get; set; }
|
||||
public double H { get; set; }
|
||||
|
||||
|
||||
private bool _isSelected = false;
|
||||
|
||||
public event PropertyChangedEventHandler? PropertyChanged;
|
||||
|
||||
public bool IsSelected
|
||||
{
|
||||
get { return _isSelected; }
|
||||
set
|
||||
{
|
||||
_isSelected = value;
|
||||
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsSelected)));
|
||||
}
|
||||
}
|
||||
private bool _isShowProperties;
|
||||
|
||||
public bool IsShowProperties
|
||||
{
|
||||
get { return _isShowProperties; }
|
||||
set
|
||||
{
|
||||
if (!IsSelected) return;
|
||||
|
||||
_isShowProperties = value;
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsShowProperties)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private bool _isRunning;
|
||||
|
||||
public bool IsRunning
|
||||
{
|
||||
get { return _isRunning; }
|
||||
set
|
||||
{
|
||||
_isRunning = value;
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsRunning)));
|
||||
}
|
||||
}
|
||||
|
||||
private long _duration;
|
||||
|
||||
public long Duration
|
||||
{
|
||||
get { return _duration; }
|
||||
set
|
||||
{
|
||||
_duration = value;
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Duration)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public List<NodeArgModel> Arguments { get; set; } = new List<NodeArgModel>();
|
||||
|
||||
public bool ShowAnchorT { get; set; } = true;
|
||||
public bool ShowAnchorB { get; set; } = true;
|
||||
public bool ShowAnchorL { get; set; } = true;
|
||||
public bool ShowAnchorR { get; set; } = true;
|
||||
|
||||
public void SetAnchorShow(string anchor, bool show)
|
||||
{
|
||||
PropertyInfo pi = this.GetType().GetProperty("ShowAnchor" + anchor);
|
||||
if (pi != null)
|
||||
{
|
||||
pi.SetValue(this, show);
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("ShowAnchor" + anchor));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//public List<>
|
||||
public virtual void Execute(IFlowContext flowContext) { }
|
||||
}
|
||||
}
|
||||
34
VisionFrame.Base/TemplateSelector/NodeArgTemplateSelector.cs
Normal file
34
VisionFrame.Base/TemplateSelector/NodeArgTemplateSelector.cs
Normal file
@@ -0,0 +1,34 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using VisionFrame.Base.Models;
|
||||
|
||||
namespace VisionFrame.Base.TemplateSelector
|
||||
{
|
||||
public class NodeArgTemplateSelector : DataTemplateSelector
|
||||
{
|
||||
public DataTemplate DropdownTempalte { get; set; }
|
||||
public DataTemplate TextBoxTempalte { get; set; }
|
||||
public DataTemplate SelectFolderTempalte { get; set; }
|
||||
public DataTemplate CompareOpratorTempalte { get; set; }
|
||||
|
||||
public override DataTemplate SelectTemplate(object item, DependencyObject container)
|
||||
{
|
||||
var model = item as NodeArgModel;
|
||||
if (model.ValueMode == 0)
|
||||
return DropdownTempalte;
|
||||
else if (model.ValueMode == 1)
|
||||
return TextBoxTempalte;
|
||||
else if (model.ValueMode == 2)
|
||||
return SelectFolderTempalte;
|
||||
else if (model.ValueMode == 3)
|
||||
return CompareOpratorTempalte;
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
10
VisionFrame.Base/VisionFrame.Base.csproj
Normal file
10
VisionFrame.Base/VisionFrame.Base.csproj
Normal file
@@ -0,0 +1,10 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net9.0-windows</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<UseWPF>true</UseWPF>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
Reference in New Issue
Block a user