From 4feddf83926195056795be1cf4ca8f55419983cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=89=BE=E7=AB=B9?= Date: Fri, 27 Jan 2023 21:29:42 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A6=86=E7=9B=96=E9=BB=98=E8=AE=A4=E5=AE=9A?= =?UTF-8?q?=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AIStudio.Wpf.DiagramDesigner.Demo.csproj | 13 +++ .../MainWindow.xaml.cs | 3 +- .../Customization/CustomGroupViewModel.cs | 41 +++++++ .../Customization/CustomNodeViewModel.cs | 70 +----------- .../ViewModels/Groups/GroupingViewModel.cs | 5 +- .../CustomDefinedDesignerItemViewModel.xaml} | 2 +- .../Nodes/CustomDefinedNodeViewModel.cs | 108 ++++++++++++++++++ .../Views/Customization/CustomGroupView.xaml | 19 ++- .../Views/Customization/CustomNodeView.xaml | 7 -- .../Views/Groups/GroupingView.xaml | 13 +-- .../Views/Nodes/CustomDefinedNodeView.xaml | 23 ++++ .../Views/Nodes/CustomDefinedNodeView.xaml.cs | 26 +++++ .../UserControls/DiagramControl.xaml.cs | 32 ++++++ .../GroupDesignerItemViewModel.cs | 2 +- 14 files changed, 271 insertions(+), 93 deletions(-) create mode 100644 AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Customization/CustomGroupViewModel.cs rename AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/{Customization/CustomDesignerItemViewModel.xaml => Nodes/CustomDefinedDesignerItemViewModel.xaml} (93%) create mode 100644 AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Nodes/CustomDefinedNodeViewModel.cs create mode 100644 AIStudio.Wpf.DiagramDesigner.Demo/Views/Nodes/CustomDefinedNodeView.xaml create mode 100644 AIStudio.Wpf.DiagramDesigner.Demo/Views/Nodes/CustomDefinedNodeView.xaml.cs diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo.csproj b/AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo.csproj index 97e216b..ce61ed7 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo.csproj +++ b/AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo.csproj @@ -23,4 +23,17 @@ + + + Code + + + + + + $(DefaultXamlRuntime) + Designer + + + diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml.cs b/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml.cs index 624683a..e983a4e 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml.cs @@ -56,6 +56,7 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo Children=new List { new MenuItemViewModel(){Title = "Svg"}, + new MenuItemViewModel(){Title = "CustomDefinedNode"}, new MenuItemViewModel(){Title = "PortlessLinks"}, } }, @@ -87,7 +88,7 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo }, new MenuItemViewModel(){Title = "Algorithms", Children=new List - { + { new MenuItemViewModel(){Title = "ReconnectLinksToClosestPorts"}, } }, diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Customization/CustomGroupViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Customization/CustomGroupViewModel.cs new file mode 100644 index 0000000..20af0c2 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Customization/CustomGroupViewModel.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows; + +namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels +{ + class CustomGroupViewModel : BaseViewModel + { + public CustomGroupViewModel() + { + Title = "Custom group"; + Info = "Creating your own custom groups is very easy!"; + + 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); + + DiagramViewModel.GroupCommand.Execute(new List { node1, node2 }); + + DiagramViewModel.ClearSelectedItemsCommand.Execute(null); + } + } +} diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Customization/CustomNodeViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Customization/CustomNodeViewModel.cs index 4a703a3..2daccfd 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Customization/CustomNodeViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Customization/CustomNodeViewModel.cs @@ -24,10 +24,10 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels DefaultDesignerItemViewModel node1 = new DefaultDesignerItemViewModel() { Left = 50, Top = 50, Text = "1" }; DiagramViewModel.DirectAddItemCommand.Execute(node1); - CustomDesignerItemViewModel node2 = new CustomDesignerItemViewModel() { Left = 300, Top = 300 }; + DefaultDesignerItemViewModel node2 = new DefaultDesignerItemViewModel() { Left = 300, Top = 300, Text = "2" }; DiagramViewModel.DirectAddItemCommand.Execute(node2); - CustomDesignerItemViewModel node3 = new CustomDesignerItemViewModel() { Left = 300, Top = 50 }; + DefaultDesignerItemViewModel node3 = new DefaultDesignerItemViewModel() { Left = 300, Top = 50, Text = "3" }; DiagramViewModel.DirectAddItemCommand.Execute(node3); ConnectionViewModel connector1 = new ConnectionViewModel(node1.RightConnector, node2.TopConnector, DrawMode.ConnectingLineSmooth, RouterMode.RouterNormal); @@ -39,70 +39,4 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels DiagramViewModel.ClearSelectedItemsCommand.Execute(null); } } - - public class CustomDesignerItemViewModel : DesignerItemViewModelBase - { - public CustomDesignerItemViewModel() : this(null) - { - - } - - public CustomDesignerItemViewModel(IDiagramViewModel root) : base(root) - { - - } - - public CustomDesignerItemViewModel(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer) - { - - } - - public CustomDesignerItemViewModel(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/Groups/GroupingViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/GroupingViewModel.cs index e6b156c..db930c8 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/GroupingViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/GroupingViewModel.cs @@ -9,8 +9,9 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels { public GroupingViewModel() { - Title = "Simple"; - Info = "A simple example of AIStudio.Wpf.DiagramDesigner."; + 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; diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Customization/CustomDesignerItemViewModel.xaml b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Nodes/CustomDefinedDesignerItemViewModel.xaml similarity index 93% rename from AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Customization/CustomDesignerItemViewModel.xaml rename to AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Nodes/CustomDefinedDesignerItemViewModel.xaml index 42191cd..066b483 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Customization/CustomDesignerItemViewModel.xaml +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Nodes/CustomDefinedDesignerItemViewModel.xaml @@ -5,7 +5,7 @@ - + diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Nodes/CustomDefinedNodeViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Nodes/CustomDefinedNodeViewModel.cs new file mode 100644 index 0000000..f2d848c --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Nodes/CustomDefinedNodeViewModel.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows; +using AIStudio.Wpf.DiagramDesigner.Models; + +namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels +{ + class CustomDefinedNodeViewModel : BaseViewModel + { + public CustomDefinedNodeViewModel() + { + Title = "Custom defined node"; + Info = "Creating your own defined design is very easy!"; + + DiagramViewModel = new DiagramViewModel(); + DiagramViewModel.CellHorizontalAlignment = CellHorizontalAlignment.Center; + DiagramViewModel.CellVerticalAlignment = CellVerticalAlignment.Center; + 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); + + CustomDefinedDesignerItemViewModel node2 = new CustomDefinedDesignerItemViewModel(DiagramViewModel) { Left = 300, Top = 300 }; + DiagramViewModel.DirectAddItemCommand.Execute(node2); + + CustomDefinedDesignerItemViewModel node3 = new CustomDefinedDesignerItemViewModel(DiagramViewModel) { Left = 300, Top = 50 }; + DiagramViewModel.DirectAddItemCommand.Execute(node3); + + ConnectionViewModel connector1 = new ConnectionViewModel(DiagramViewModel, node1.RightConnector, node2.TopConnector, DrawMode.ConnectingLineSmooth, RouterMode.RouterNormal); + DiagramViewModel.DirectAddItemCommand.Execute(connector1); + + ConnectionViewModel connector2 = new ConnectionViewModel(DiagramViewModel, node2.BottomConnector, node3.BottomConnector, DrawMode.ConnectingLineStraight, RouterMode.RouterOrthogonal); + DiagramViewModel.DirectAddItemCommand.Execute(connector2); + + DiagramViewModel.ClearSelectedItemsCommand.Execute(null); + } + } + + 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/Customization/CustomGroupView.xaml b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Customization/CustomGroupView.xaml index 9e1102d..a3e7711 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/Views/Customization/CustomGroupView.xaml +++ b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Customization/CustomGroupView.xaml @@ -3,10 +3,25 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" - xmlns:local="clr-namespace:AIStudio.Wpf.DiagramDesigner.Demo.Views" + xmlns:dd="https://gitee.com/akwkevin/aistudio.-wpf.-diagram" + xmlns:controls="clr-namespace:AIStudio.Wpf.DiagramDesigner.Demo.Controls" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> - + + + + + + + + + + + + + + + diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/Views/Customization/CustomNodeView.xaml b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Customization/CustomNodeView.xaml index 494fa5e..df61ec4 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/Views/Customization/CustomNodeView.xaml +++ b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Customization/CustomNodeView.xaml @@ -7,13 +7,6 @@ xmlns:controls="clr-namespace:AIStudio.Wpf.DiagramDesigner.Demo.Controls" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> - - - - - - - diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/GroupingView.xaml b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/GroupingView.xaml index 00e43b1..a0e9bbb 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/GroupingView.xaml +++ b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/GroupingView.xaml @@ -6,19 +6,10 @@ xmlns:dd="https://gitee.com/akwkevin/aistudio.-wpf.-diagram" xmlns:controls="clr-namespace:AIStudio.Wpf.DiagramDesigner.Demo.Controls" mc:Ignorable="d" - d:DesignHeight="450" d:DesignWidth="800"> - - - - - - - - + d:DesignHeight="450" d:DesignWidth="800"> - - + diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/Views/Nodes/CustomDefinedNodeView.xaml b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Nodes/CustomDefinedNodeView.xaml new file mode 100644 index 0000000..058598c --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Nodes/CustomDefinedNodeView.xaml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/Views/Nodes/CustomDefinedNodeView.xaml.cs b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Nodes/CustomDefinedNodeView.xaml.cs new file mode 100644 index 0000000..365c7aa --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Nodes/CustomDefinedNodeView.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 +{ + /// + /// CustomNodeView.xaml 的交互逻辑 + /// + public partial class CustomDefinedNodeView : UserControl + { + public CustomDefinedNodeView() + { + InitializeComponent(); + } + } +} diff --git a/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml.cs b/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml.cs index 868cae5..d7ebc2b 100644 --- a/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml.cs +++ b/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml.cs @@ -22,6 +22,36 @@ namespace AIStudio.Wpf.DiagramDesigner public DiagramControl() { InitializeComponent(); + + if (ResourceDictionary != null) + { + this.Resources.MergedDictionaries.Add(ResourceDictionary); + } + } + + public static readonly DependencyProperty ResourceDictionaryProperty = DependencyProperty.Register(nameof(ResourceDictionary), typeof(ResourceDictionary), typeof(DiagramControl), new UIPropertyMetadata(null, OnResourceDictionaryChanged)); + + private static void OnResourceDictionaryChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is DiagramControl diagram) + { + if (e.NewValue is ResourceDictionary dictionary) + { + diagram.Resources.MergedDictionaries.Add(dictionary); + } + } + } + + public ResourceDictionary ResourceDictionary + { + get + { + return (ResourceDictionary)GetValue(ResourceDictionaryProperty); + } + set + { + SetValue(ResourceDictionaryProperty, value); + } } public static readonly DependencyProperty ZoomValueProperty = DependencyProperty.Register(nameof(ZoomValue), typeof(double), typeof(DiagramControl), new UIPropertyMetadata(1d)); @@ -42,6 +72,8 @@ namespace AIStudio.Wpf.DiagramDesigner { //DesignerCanvas myDesignerCanvas = sender as DesignerCanvas; //zoomBox.DesignerCanvas = myDesignerCanvas; + + } private async void ScaleTransform_Changed(object sender, EventArgs e) diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/GroupDesignerItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/GroupDesignerItemViewModel.cs index fed0785..e0c1d19 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/GroupDesignerItemViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/GroupDesignerItemViewModel.cs @@ -23,7 +23,7 @@ namespace AIStudio.Wpf.DiagramDesigner { base.Init(root); - this.IsHitTestVisible = false; + this.IsHitTestVisible = true; } protected override void InitConnector()