From 397ebcfac2be8dcf6f52b53cbce8d22d08808bfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=89=BE=E7=AB=B9?= Date: Thu, 2 Feb 2023 23:00:36 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89group=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MainWindow.xaml.cs | 1 + ...CustomDefinedGroupDesignerItemViewModel.cs | 56 +++++ ...stomDefinedGroupDesignerItemViewModel.xaml | 24 ++ .../Groups/CustomDefinedGroupViewModel.cs | 45 ++++ .../CustomDefinedDesignerItemViewModel.cs | 73 ++++++ .../Nodes/CustomDefinedNodeViewModel.cs | 66 +---- .../Views/Groups/CustomDefinedGroupView.xaml | 23 ++ .../Groups/CustomDefinedGroupView.xaml.cs | 26 ++ .../BaseViewModel/DiagramViewModel.cs | 19 +- .../GroupDesignerItemViewModel.cs | 20 ++ ...tudio.Wpf.Flowchart_vqigpxdt_wpftmp.csproj | 238 ++++++++++++++++++ 11 files changed, 523 insertions(+), 68 deletions(-) create mode 100644 AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/CustomDefinedGroupDesignerItemViewModel.cs create mode 100644 AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/CustomDefinedGroupDesignerItemViewModel.xaml create mode 100644 AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/CustomDefinedGroupViewModel.cs create mode 100644 AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Nodes/CustomDefinedDesignerItemViewModel.cs create mode 100644 AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/CustomDefinedGroupView.xaml create mode 100644 AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/CustomDefinedGroupView.xaml.cs create mode 100644 AIStudio.Wpf.Flowchart/AIStudio.Wpf.Flowchart_vqigpxdt_wpftmp.csproj diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml.cs b/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml.cs index 82f14aa..7a4c7cc 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml.cs @@ -81,6 +81,7 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo Children=new List { new MenuItemViewModel(){Title = "Grouping"}, + new MenuItemViewModel(){Title = "CustomDefinedGroup"}, } }, new MenuItemViewModel(){Title = "Customization", diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/CustomDefinedGroupDesignerItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/CustomDefinedGroupDesignerItemViewModel.cs new file mode 100644 index 0000000..55d4875 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/CustomDefinedGroupDesignerItemViewModel.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Text; +using AIStudio.Wpf.DiagramDesigner.Models; + +namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels +{ + public class CustomDefinedGroupDesignerItemViewModel : GroupDesignerItemViewModel + { + public CustomDefinedGroupDesignerItemViewModel() : this(null) + { + } + + public CustomDefinedGroupDesignerItemViewModel(IDiagramViewModel root) : base(root) + { + } + + public CustomDefinedGroupDesignerItemViewModel(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer) + { + + } + + public CustomDefinedGroupDesignerItemViewModel(IDiagramViewModel root, SerializableItem serializableItem, string serializableType) : base(root, serializableItem, serializableType) + { + + } + + public override SelectableItemBase GetSerializableObject() + { + return new DesignerItemBase(this, Describe); + } + + protected override void LoadDesignerItemViewModel(SelectableItemBase designerbase) + { + base.LoadDesignerItemViewModel(designerbase); + + if (designerbase is DesignerItemBase designer) + { + this.Describe = designer.Reserve; + } + } + + private string _describe; + public string Describe + { + get + { + return _describe; + } + set + { + SetProperty(ref _describe, value); + } + } + } +} diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/CustomDefinedGroupDesignerItemViewModel.xaml b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/CustomDefinedGroupDesignerItemViewModel.xaml new file mode 100644 index 0000000..1bc87a7 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/CustomDefinedGroupDesignerItemViewModel.xaml @@ -0,0 +1,24 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/CustomDefinedGroupViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/CustomDefinedGroupViewModel.cs new file mode 100644 index 0000000..ee9f3d5 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/CustomDefinedGroupViewModel.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows; + +namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels.Groups +{ + class CustomDefinedGroupViewModel : BaseViewModel + { + public CustomDefinedGroupViewModel() + { + Title = "Grouping"; + Info = "You can (un)group nodes using CTRL+ALT+G.
" + + "Currently, the library doesn't handle nested groups yet nor ports."; + + DiagramViewModel = new DiagramViewModel(); + DiagramViewModel.PageSizeType = PageSizeType.Custom; + DiagramViewModel.PageSize = new Size(double.NaN, double.NaN); + DiagramViewModel.ColorViewModel = new ColorViewModel(); + DiagramViewModel.ColorViewModel.FillColor.Color = System.Windows.Media.Colors.Orange; + + DefaultDesignerItemViewModel node1 = new DefaultDesignerItemViewModel(DiagramViewModel) { Left = 50, Top = 50, Text = "1" }; + DiagramViewModel.DirectAddItemCommand.Execute(node1); + + DefaultDesignerItemViewModel node2 = new DefaultDesignerItemViewModel(DiagramViewModel) { Left = 300, Top = 300, Text = "2" }; + DiagramViewModel.DirectAddItemCommand.Execute(node2); + + DefaultDesignerItemViewModel node3 = new DefaultDesignerItemViewModel(DiagramViewModel) { Left = 300, Top = 50, Text = "3" }; + DiagramViewModel.DirectAddItemCommand.Execute(node3); + + ConnectionViewModel connector1 = new ConnectionViewModel(DiagramViewModel, node1.RightConnector, node2.LeftConnector, DrawMode.ConnectingLineSmooth, RouterMode.RouterNormal); + DiagramViewModel.DirectAddItemCommand.Execute(connector1); + + ConnectionViewModel connector2 = new ConnectionViewModel(DiagramViewModel, node2.RightConnector, node3.RightConnector, DrawMode.ConnectingLineStraight, RouterMode.RouterOrthogonal); + DiagramViewModel.DirectAddItemCommand.Execute(connector2); + + //Custom 需要设置为True,表示外面自定义的Group替换默认的。 + CustomDefinedGroupDesignerItemViewModel group = new CustomDefinedGroupDesignerItemViewModel() { Describe = "This is a custom group", Custom = true}; + group.FontViewModel.FontColor = System.Windows.Media.Colors.Orange; + DiagramViewModel.GroupCommand.Execute(new List { group, node1, node2 }); + + DiagramViewModel.ClearSelectedItemsCommand.Execute(null); + } + } +} diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Nodes/CustomDefinedDesignerItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Nodes/CustomDefinedDesignerItemViewModel.cs new file mode 100644 index 0000000..4a634f8 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Nodes/CustomDefinedDesignerItemViewModel.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Text; +using AIStudio.Wpf.DiagramDesigner.Models; + +namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels +{ + public class CustomDefinedDesignerItemViewModel : DesignerItemViewModelBase + { + public CustomDefinedDesignerItemViewModel() : this(null) + { + + } + + public CustomDefinedDesignerItemViewModel(IDiagramViewModel root) : base(root) + { + + } + + public CustomDefinedDesignerItemViewModel(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer) + { + + } + + public CustomDefinedDesignerItemViewModel(IDiagramViewModel root, SerializableItem serializableItem, string serializableType) : base(root, serializableItem, serializableType) + { + + } + + public override SelectableItemBase GetSerializableObject() + { + return new DesignerItemBase(this, Answer); + } + + protected override void Init(IDiagramViewModel root) + { + base.Init(root); + + this.ItemWidth = 150; + this.ItemHeight = 80; + InitConnector(); + } + + protected override void InitConnector() + { + connectors.Add(new FullyCreatedConnectorInfo(this, ConnectorOrientation.Top)); + connectors.Add(new FullyCreatedConnectorInfo(this, ConnectorOrientation.Bottom)); + } + + protected override void LoadDesignerItemViewModel(SelectableItemBase designerbase) + { + base.LoadDesignerItemViewModel(designerbase); + + if (designerbase is DesignerItemBase designer) + { + this.Answer = designer.Reserve; + } + } + + private string _answer; + public string Answer + { + get + { + return _answer; + } + set + { + SetProperty(ref _answer, value); + } + } + } +} diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Nodes/CustomDefinedNodeViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Nodes/CustomDefinedNodeViewModel.cs index 29daf42..226ef2d 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Nodes/CustomDefinedNodeViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Nodes/CustomDefinedNodeViewModel.cs @@ -38,69 +38,5 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels } } - public class CustomDefinedDesignerItemViewModel : DesignerItemViewModelBase - { - public CustomDefinedDesignerItemViewModel() : this(null) - { - - } - - public CustomDefinedDesignerItemViewModel(IDiagramViewModel root) : base(root) - { - - } - - public CustomDefinedDesignerItemViewModel(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer) - { - - } - - public CustomDefinedDesignerItemViewModel(IDiagramViewModel root, SerializableItem serializableItem, string serializableType) : base(root, serializableItem, serializableType) - { - - } - - public override SelectableItemBase GetSerializableObject() - { - return new DesignerItemBase(this, Answer); - } - - protected override void Init(IDiagramViewModel root) - { - base.Init(root); - - this.ItemWidth = 150; - this.ItemHeight = 80; - InitConnector(); - } - - protected override void InitConnector() - { - connectors.Add(new FullyCreatedConnectorInfo(this, ConnectorOrientation.Top)); - connectors.Add(new FullyCreatedConnectorInfo(this, ConnectorOrientation.Bottom)); - } - - protected override void LoadDesignerItemViewModel(SelectableItemBase designerbase) - { - base.LoadDesignerItemViewModel(designerbase); - - if (designerbase is DesignerItemBase designer) - { - this.Answer = designer.Reserve; - } - } - - private string _answer; - public string Answer - { - get - { - return _answer; - } - set - { - SetProperty(ref _answer, value); - } - } - } + } diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/CustomDefinedGroupView.xaml b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/CustomDefinedGroupView.xaml new file mode 100644 index 0000000..4e9968e --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/CustomDefinedGroupView.xaml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/CustomDefinedGroupView.xaml.cs b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/CustomDefinedGroupView.xaml.cs new file mode 100644 index 0000000..dc05c00 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/CustomDefinedGroupView.xaml.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace AIStudio.Wpf.DiagramDesigner.Demo.Views.Groups +{ + /// + /// CustomDefinedGroupView.xaml 的交互逻辑 + /// + public partial class CustomDefinedGroupView : UserControl + { + public CustomDefinedGroupView() + { + InitializeComponent(); + } + } +} diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs index 6b5c39c..b36e68b 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs @@ -364,7 +364,7 @@ namespace AIStudio.Wpf.DiagramDesigner { SetProperty(ref _cellVerticalAlignment, value); } - } + } private bool _isEditName; [Browsable(false)] @@ -1701,9 +1701,19 @@ namespace AIStudio.Wpf.DiagramDesigner private void ExecuteGroupCommand(object parameter) { List items; + GroupDesignerItemViewModel groupItem = null; if (parameter is IEnumerable para) { - items = para.ToList(); + if (para.FirstOrDefault() is GroupDesignerItemViewModel groupDesignerItemViewModel && groupDesignerItemViewModel.Custom) + { + groupDesignerItemViewModel.Custom = false; + groupItem = groupDesignerItemViewModel; + items = para.Skip(1).ToList(); + } + else + { + items = para.ToList(); + } } else { @@ -1712,7 +1722,10 @@ namespace AIStudio.Wpf.DiagramDesigner RectangleBase rect = GetBoundingRectangle(items); - GroupDesignerItemViewModel groupItem = new GroupDesignerItemViewModel(); + if (groupItem == null) + { + groupItem = new GroupDesignerItemViewModel(); + } groupItem.IsGroup = true; groupItem.ItemWidth = rect.Width; groupItem.ItemHeight = rect.Height; diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/GroupDesignerItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/GroupDesignerItemViewModel.cs index e0c1d19..1fc55d1 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/GroupDesignerItemViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/GroupDesignerItemViewModel.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using AIStudio.Wpf.DiagramDesigner; +using AIStudio.Wpf.DiagramDesigner.Models; namespace AIStudio.Wpf.DiagramDesigner { @@ -19,6 +20,16 @@ namespace AIStudio.Wpf.DiagramDesigner } + public GroupDesignerItemViewModel(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer) + { + + } + + public GroupDesignerItemViewModel(IDiagramViewModel root, SerializableItem serializableItem, string serializableType) : base(root, serializableItem, serializableType) + { + + } + protected override void Init(IDiagramViewModel root) { base.Init(root); @@ -34,5 +45,14 @@ namespace AIStudio.Wpf.DiagramDesigner protected override void ExecuteEditCommand(object param) { } + + + /// + /// 打标记使用 + /// + public bool Custom + { + get;set; + } } } diff --git a/AIStudio.Wpf.Flowchart/AIStudio.Wpf.Flowchart_vqigpxdt_wpftmp.csproj b/AIStudio.Wpf.Flowchart/AIStudio.Wpf.Flowchart_vqigpxdt_wpftmp.csproj new file mode 100644 index 0000000..5bf242b --- /dev/null +++ b/AIStudio.Wpf.Flowchart/AIStudio.Wpf.Flowchart_vqigpxdt_wpftmp.csproj @@ -0,0 +1,238 @@ + + + AIStudio.Wpf.Flowchart + obj\Debug\ + obj\ + F:\aistudio.-wpf.-diagram\AIStudio.Wpf.Flowchart\obj\ + <_TargetAssemblyProjectName>AIStudio.Wpf.Flowchart + + + + true + AIStudio.Wpf.Controls + akwkevin + https://gitee.com/akwkevin + A.png + + + 1.0.4 + 一个Wpf的流程图控件 + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file