From e8f91abd68aa07d02a551cea97537100b09706a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=89=BE=E7=AB=B9?= Date: Sat, 4 Feb 2023 16:38:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=85=E9=83=A8=E8=BF=9E=E6=8E=A5=E7=82=B9?= =?UTF-8?q?=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewModels/LogicalViewModel.cs | 3 +- .../MainWindow.xaml.cs | 1 + .../ViewModels/Links/MarkersViewModel.cs | 4 +- .../Links/PathGeneratorsViewModel.cs | 17 +++++++ .../ViewModels/Ports/InnerPortViewModel.cs | 48 +++++++++++++++++++ .../Views/Ports/InnerPortView.xaml | 16 +++++++ .../Views/Ports/InnerPortView.xaml.cs | 26 ++++++++++ .../Serializables/SelectableItemBase.cs | 5 ++ .../UserControls/LineControl.xaml.cs | 23 ++++----- .../AdditionViewModel/ColorViewModel.cs | 13 +++++ .../Interface/IColorViewModel.cs | 4 ++ .../BaseViewModel/ConnectionViewModel.cs | 14 +++--- 12 files changed, 153 insertions(+), 21 deletions(-) create mode 100644 AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Ports/InnerPortViewModel.cs create mode 100644 AIStudio.Wpf.DiagramDesigner.Demo/Views/Ports/InnerPortView.xaml create mode 100644 AIStudio.Wpf.DiagramDesigner.Demo/Views/Ports/InnerPortView.xaml.cs diff --git a/AIStudio.Wpf.DiagramApp/ViewModels/LogicalViewModel.cs b/AIStudio.Wpf.DiagramApp/ViewModels/LogicalViewModel.cs index 14ee724..83581e2 100644 --- a/AIStudio.Wpf.DiagramApp/ViewModels/LogicalViewModel.cs +++ b/AIStudio.Wpf.DiagramApp/ViewModels/LogicalViewModel.cs @@ -39,7 +39,7 @@ namespace AIStudio.Wpf.Logical base.Init(); TimerDesignerItemViewModel timer = new TimerDesignerItemViewModel() { Left = 28, Top = 28 }; - timer.Value = 0.5; + timer.Value = 1; DiagramViewModel.DirectAddItemCommand.Execute(timer); InputItemViewModel in1 = new InputItemViewModel() { Left = 28, Top = 110 }; @@ -210,6 +210,7 @@ namespace AIStudio.Wpf.Logical input.Value.ColorViewModel.FillColor.Color = connector.SourceConnectorInfo.ColorViewModel.FillColor.Color; connector.ColorViewModel.LineColor.Color = connector.SourceConnectorInfo.ColorViewModel.FillColor.Color; + connector.ColorViewModel.FillColor.Color = connector.SourceConnectorInfo.ColorViewModel.FillColor.Color; if (item.LogicalType == LogicalType.Output) { diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml.cs b/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml.cs index 7a4c7cc..b0bc40e 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml.cs @@ -75,6 +75,7 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo Children=new List { new MenuItemViewModel(){Title = "ColoredPort"}, + new MenuItemViewModel(){Title = "InnerPort"} } }, new MenuItemViewModel(){Title = "Groups", diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/MarkersViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/MarkersViewModel.cs index 3eb811c..9045555 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/MarkersViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/MarkersViewModel.cs @@ -73,8 +73,8 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels DiagramViewModel.DirectAddItemCommand.Execute(node2); connector1 = new ConnectionViewModel(DiagramViewModel, node1.RightConnector, node2.LeftConnector); - connector1.ShapeViewModel.SourceMarker = new LinkMarker("M 0 -8 L 3 -8 3 8 0 8 z M 4 -8 7 -8 7 8 4 8 z M 8 -8 16 0 8 8 z", 16, ArrowPathStyle.Arrow, ArrowSizeStyle.ExtraLarge); - connector1.ShapeViewModel.SinkMarker = new LinkMarker("M 0 -8 L 8 -8 4 0 8 8 0 8 4 0 z", 8, ArrowPathStyle.Arrow, ArrowSizeStyle.Small); + connector1.ShapeViewModel.SourceMarker = new LinkMarker("M 0 -8 L 3 -8 3 8 0 8 z M 4 -8 7 -8 7 8 4 8 z M 8 -8 16 0 8 8 z", 16, 16, ArrowPathStyle.Arrow, ArrowSizeStyle.ExtraLarge); + connector1.ShapeViewModel.SinkMarker = new LinkMarker("M 0 -8 L 8 -8 4 0 8 8 0 8 4 0 z", 8, 8, ArrowPathStyle.Arrow, ArrowSizeStyle.Small); connector1.AddLabel("Custom"); DiagramViewModel.DirectAddItemCommand.Execute(connector1); diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/PathGeneratorsViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/PathGeneratorsViewModel.cs index b5c9ed6..95f7b5f 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/PathGeneratorsViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/PathGeneratorsViewModel.cs @@ -36,6 +36,23 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels connector2.AddLabel("Smooth"); DiagramViewModel.DirectAddItemCommand.Execute(connector2); + DefaultDesignerItemViewModel node11 = new DefaultDesignerItemViewModel(DiagramViewModel) { Left = 50, Top = 450, Text = "11" }; + DiagramViewModel.DirectAddItemCommand.Execute(node11); + + DefaultDesignerItemViewModel node12 = new DefaultDesignerItemViewModel(DiagramViewModel) { Left = 250, Top = 648, Text = "12" }; + DiagramViewModel.DirectAddItemCommand.Execute(node12); + + DefaultDesignerItemViewModel node13 = new DefaultDesignerItemViewModel(DiagramViewModel) { Left = 400, Top = 450, Text = "13" }; + DiagramViewModel.DirectAddItemCommand.Execute(node13); + + ConnectionViewModel connector11 = new ConnectionViewModel(DiagramViewModel, node11.RightConnector, node12.LeftConnector, DrawMode.ConnectingLineBoundary, RouterMode.RouterNormal); + connector11.AddLabel("Boundary"); + DiagramViewModel.DirectAddItemCommand.Execute(connector11); + + ConnectionViewModel connector12 = new ConnectionViewModel(DiagramViewModel, node12.RightConnector, node13.LeftConnector, DrawMode.ConnectingLineCorner, RouterMode.RouterNormal); + connector12.AddLabel("Corner"); + DiagramViewModel.DirectAddItemCommand.Execute(connector12); + DiagramViewModel.ClearSelectedItemsCommand.Execute(null); } } diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Ports/InnerPortViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Ports/InnerPortViewModel.cs new file mode 100644 index 0000000..913c7df --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Ports/InnerPortViewModel.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows; + +namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels +{ + class InnerPortViewModel : BaseViewModel + { + public InnerPortViewModel() + { + Title = "InnerPort"; + Info = "You can add connection points inside a node"; + + 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" }; + node1.ClearConnectors(); + var port1 = new FullyCreatedConnectorInfo(DiagramViewModel, node1, ConnectorOrientation.Right, true) { XRatio = 0.5, YRatio = 0.5 }; + node1.AddConnector(port1); + + DiagramViewModel.DirectAddItemCommand.Execute(node1); + + DefaultDesignerItemViewModel node2 = new DefaultDesignerItemViewModel(DiagramViewModel) { Left = 300, Top = 300, Text = "2" }; + node2.ClearConnectors(); + var port2_1 = new FullyCreatedConnectorInfo(DiagramViewModel, node2, ConnectorOrientation.Top, true) { XRatio = 0.2, YRatio = 0.8 }; + var port2_2 = new FullyCreatedConnectorInfo(DiagramViewModel, node2, ConnectorOrientation.Top, true) { XRatio = 0.8, YRatio = 0.2 }; + DiagramViewModel.DirectAddItemCommand.Execute(node2); + + DefaultDesignerItemViewModel node3 = new DefaultDesignerItemViewModel(DiagramViewModel) { Left = 300, Top = 50, Text = "3" }; + node3.ClearConnectors(); + var port3 = new FullyCreatedConnectorInfo(DiagramViewModel, node3, ConnectorOrientation.Bottom, true) { XRatio = 0.5, YRatio = 0.5 }; + DiagramViewModel.DirectAddItemCommand.Execute(node3); + + ConnectionViewModel connector1 = new ConnectionViewModel(DiagramViewModel, port1, port2_1, DrawMode.ConnectingLineSmooth, RouterMode.RouterNormal); + DiagramViewModel.DirectAddItemCommand.Execute(connector1); + + ConnectionViewModel connector2 = new ConnectionViewModel(DiagramViewModel, port2_2, port3, DrawMode.ConnectingLineStraight, RouterMode.RouterOrthogonal); + DiagramViewModel.DirectAddItemCommand.Execute(connector2); + + DiagramViewModel.ClearSelectedItemsCommand.Execute(null); + } + } +} diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/Views/Ports/InnerPortView.xaml b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Ports/InnerPortView.xaml new file mode 100644 index 0000000..8bd2212 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Ports/InnerPortView.xaml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/Views/Ports/InnerPortView.xaml.cs b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Ports/InnerPortView.xaml.cs new file mode 100644 index 0000000..4402b2c --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Ports/InnerPortView.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 +{ + /// + /// InnerPortView.xaml 的交互逻辑 + /// + public partial class InnerPortView : UserControl + { + public InnerPortView() + { + InitializeComponent(); + } + } +} diff --git a/AIStudio.Wpf.DiagramDesigner/Models/Serializables/SelectableItemBase.cs b/AIStudio.Wpf.DiagramDesigner/Models/Serializables/SelectableItemBase.cs index 3a3f0e3..076e034 100644 --- a/AIStudio.Wpf.DiagramDesigner/Models/Serializables/SelectableItemBase.cs +++ b/AIStudio.Wpf.DiagramDesigner/Models/Serializables/SelectableItemBase.cs @@ -169,6 +169,11 @@ namespace AIStudio.Wpf.DiagramDesigner get; set; } + [XmlAttribute] + public double LineAnimationDuration + { + get; set; + } public event PropertyChangedEventHandler PropertyChanged; } diff --git a/AIStudio.Wpf.DiagramDesigner/UserControls/LineControl.xaml.cs b/AIStudio.Wpf.DiagramDesigner/UserControls/LineControl.xaml.cs index f73d07c..4e9b590 100644 --- a/AIStudio.Wpf.DiagramDesigner/UserControls/LineControl.xaml.cs +++ b/AIStudio.Wpf.DiagramDesigner/UserControls/LineControl.xaml.cs @@ -30,18 +30,18 @@ namespace AIStudio.Wpf.DiagramDesigner private void LineControl_Unloaded(object sender, RoutedEventArgs e) { - if (this.DataContext is ConnectionViewModel connector) + if (this.DataContext is ConnectionViewModel connector && connector.ColorViewModel != null) { - connector.PropertyChanged -= Connector_PropertyChanged; + connector.ColorViewModel.PropertyChanged -= Connector_PropertyChanged; } _story?.Stop(); } private async void PathAnimation_Loaded(object sender, RoutedEventArgs e) { - if (this.DataContext is ConnectionViewModel connector) + if (this.DataContext is ConnectionViewModel connector && connector.ColorViewModel != null) { - connector.PropertyChanged -= Connector_PropertyChanged; + connector.ColorViewModel.PropertyChanged -= Connector_PropertyChanged; connector.PropertyChanged += Connector_PropertyChanged; } this.ball.Visibility = Visibility.Collapsed; @@ -52,7 +52,8 @@ namespace AIStudio.Wpf.DiagramDesigner { switch (e.PropertyName) { - case nameof(ConnectionViewModel.PathGeneratorResult): + case nameof(ColorViewModel.LineAnimation): + case nameof(ColorViewModel.LineAnimationDuration): await DoAnimation(); break; @@ -71,10 +72,10 @@ namespace AIStudio.Wpf.DiagramDesigner ball.Visibility = Visibility.Collapsed; break; case LineAnimation.PathAnimation: - PathAnimation(); + PathAnimation(connector.ColorViewModel.LineAnimationDuration); break; case LineAnimation.DashAnimation: - DashAnimation(); + DashAnimation(connector.ColorViewModel.LineAnimationDuration); break; } } @@ -82,7 +83,7 @@ namespace AIStudio.Wpf.DiagramDesigner Storyboard _story; - private void PathAnimation() + private void PathAnimation(double second) { this.ball.Visibility = Visibility.Visible; @@ -105,7 +106,7 @@ namespace AIStudio.Wpf.DiagramDesigner DoubleAnimationUsingPath animationX = new DoubleAnimationUsingPath(); animationX.PathGeometry = this.line.Data?.GetFlattenedPathGeometry(); animationX.Source = PathAnimationSource.X; - animationX.Duration = new Duration(TimeSpan.FromSeconds(2)); + animationX.Duration = new Duration(TimeSpan.FromSeconds(second)); DoubleAnimationUsingPath animationY = new DoubleAnimationUsingPath(); animationY.PathGeometry = this.line.Data?.GetFlattenedPathGeometry(); @@ -135,12 +136,12 @@ namespace AIStudio.Wpf.DiagramDesigner } - private void DashAnimation() + private void DashAnimation(double second) { this.ball.Visibility = Visibility.Collapsed; - var animation = new DoubleAnimation(0, -10, new Duration(TimeSpan.FromSeconds(0.5))) + var animation = new DoubleAnimation(0, -10, new Duration(TimeSpan.FromSeconds(second))) { RepeatBehavior = RepeatBehavior.Forever, }; diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/ColorViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/ColorViewModel.cs index 2941d40..e717124 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/ColorViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/ColorViewModel.cs @@ -150,6 +150,19 @@ namespace AIStudio.Wpf.DiagramDesigner SetProperty(ref _lineAnimation, value); } } + + private double _lineAnimationDuration = 1; + public double LineAnimationDuration + { + get + { + return _lineAnimationDuration; + } + set + { + SetProperty(ref _lineAnimationDuration, value); + } + } } diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/Interface/IColorViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/Interface/IColorViewModel.cs index 40ca6ec..fb4088d 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/Interface/IColorViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/Interface/IColorViewModel.cs @@ -33,6 +33,10 @@ namespace AIStudio.Wpf.DiagramDesigner { get; set; } + double LineAnimationDuration + { + get; set; + } event PropertyChangedEventHandler PropertyChanged; } } diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs index d102623..118109a 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs @@ -476,11 +476,16 @@ namespace AIStudio.Wpf.DiagramDesigner case nameof(DesignerItemViewModelBase.ItemWidth): case nameof(DesignerItemViewModelBase.Left): case nameof(DesignerItemViewModelBase.Top): - SourceA = PointHelper.GetPointForConnector(this.SourceConnectorInfo); if (IsFullConnection) { + //减少触发一次画线 + SourceA = PointHelper.GetPointForConnector(this.SourceConnectorInfo); SourceB = PointHelper.GetPointForConnector(this.SinkConnectorInfoFully); } + else + { + SourceA = PointHelper.GetPointForConnector(this.SourceConnectorInfo); + } break; } } @@ -519,12 +524,7 @@ namespace AIStudio.Wpf.DiagramDesigner } else if (sender is ColorViewModel) { - switch (e.PropertyName) - { - case nameof(ColorViewModel.LineAnimation): - RaisePropertyChanged(nameof(PathGeneratorResult)); - break; - } + } }