From b9210cb6d90aebaacbe4f902306144a1b39e4985 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=89=BE=E7=AB=B9?= Date: Wed, 3 May 2023 18:35:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Ddemo=E4=B8=AD=E5=BD=A9?= =?UTF-8?q?=E8=89=B2=E8=8A=82=E7=82=B9=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BarcodeDesignerItemViewModel.cs | 2 +- .../OutLineTextDesignerItemViewModel.cs | 2 +- .../Controls/DesignerCanvas.cs | 67 +++++++++++++------ .../Themes/ConnectorItem.xaml | 6 ++ .../BaseViewModel/ConnectionViewModel.cs | 5 ++ .../Connector/ConnectorInfoBase.cs | 15 ++++- .../BaseViewModel/DiagramViewModel.cs | 66 ++++++++++++------ .../SelectableDesignerItemViewModelBase.cs | 2 +- .../DefaultViewModel/ImageItemViewModel.cs | 2 +- .../DefaultViewModel/MediaItemViewModel.cs | 2 +- 10 files changed, 123 insertions(+), 46 deletions(-) diff --git a/AIStudio.Wpf.DiagramDesigner.Additionals/Extensions/ViewModels/BarcodeDesignerItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Additionals/Extensions/ViewModels/BarcodeDesignerItemViewModel.cs index d1b873a..a173341 100644 --- a/AIStudio.Wpf.DiagramDesigner.Additionals/Extensions/ViewModels/BarcodeDesignerItemViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Additionals/Extensions/ViewModels/BarcodeDesignerItemViewModel.cs @@ -69,7 +69,7 @@ namespace AIStudio.Wpf.DiagramDesigner.Additionals.Extensions.ViewModels EditData(); } - public override bool InitData() + public override bool Verify() { if (string.IsNullOrEmpty(Icon)) return EditData(); diff --git a/AIStudio.Wpf.DiagramDesigner.Additionals/Extensions/ViewModels/OutLineTextDesignerItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Additionals/Extensions/ViewModels/OutLineTextDesignerItemViewModel.cs index 4fa50a4..2aa1f03 100644 --- a/AIStudio.Wpf.DiagramDesigner.Additionals/Extensions/ViewModels/OutLineTextDesignerItemViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Additionals/Extensions/ViewModels/OutLineTextDesignerItemViewModel.cs @@ -74,7 +74,7 @@ namespace AIStudio.Wpf.DiagramDesigner.Additionals.Extensions.ViewModels EditData(); } - public override bool InitData() + public override bool Verify() { if (string.IsNullOrEmpty(Text)) return EditData(); diff --git a/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs b/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs index 7500192..f7b4da1 100644 --- a/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs +++ b/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs @@ -41,36 +41,56 @@ namespace AIStudio.Wpf.DiagramDesigner private Point? rubberbandSelectionStartPoint = null; - private Connector sourceConnector; + private Connector _sourceConnector; public Connector SourceConnector { get { - return sourceConnector; + return _sourceConnector; } set { - if (sourceConnector != value) + if (_sourceConnector != value) { - sourceConnector = value; + _sourceConnector = value; + if (_sourceConnector != null) + { + ConnectorInfoBase sourceDataItem = _sourceConnector.Info; - ConnectorInfoBase sourceDataItem = sourceConnector.Info; + //Rect rectangleBounds = _sourceConnector.TransformToVisual(this).TransformBounds(new Rect(_sourceConnector.RenderSize)); + //Point point = new Point(rectangleBounds.Left + (rectangleBounds.Width / 2), + // rectangleBounds.Bottom + (rectangleBounds.Height / 2)); - //Rect rectangleBounds = sourceConnector.TransformToVisual(this).TransformBounds(new Rect(sourceConnector.RenderSize)); - //Point point = new Point(rectangleBounds.Left + (rectangleBounds.Width / 2), - // rectangleBounds.Bottom + (rectangleBounds.Height / 2)); + Point point = sourceDataItem.MiddlePosition; - Point point = sourceDataItem.MiddlePosition; + partialConnection = new ConnectionViewModel(_viewModel, sourceDataItem, new PartCreatedConnectorInfo(point.X, point.Y), DrawMode, RouterMode); - partialConnection = new ConnectionViewModel(_viewModel, sourceDataItem, new PartCreatedConnectorInfo(point.X, point.Y), DrawMode, RouterMode); - - _viewModel.Add(partialConnection); - partialConnection.ZIndex = -1; + _viewModel.Add(partialConnection); + partialConnection.ZIndex = -1; + } } } } - private Connector sinkConnector; + private Connector _sinkConnector; + public Connector SinkConnector + { + get + { + return _sinkConnector; + } + set + { + if (_sinkConnector != null) + { + _sinkConnector.Info.DisableAttachTo = false; + } + if (_sinkConnector != value) + { + _sinkConnector = value; + } + } + } private DrawMode DrawMode { @@ -406,7 +426,12 @@ namespace AIStudio.Wpf.DiagramDesigner if (e.LeftButton == MouseButtonState.Pressed) { partialConnection.SinkConnectorInfo = new PartCreatedConnectorInfo(currentPoint.X, currentPoint.Y); - sinkConnector = HitTesting(currentPoint); + + SinkConnector = HitTesting(currentPoint); + if (SinkConnector?.Info?.CanAttachTo(SourceConnector?.Info) == false) + { + SinkConnector.Info.DisableAttachTo = true; + } if (EnableSnapping) { @@ -452,12 +477,12 @@ namespace AIStudio.Wpf.DiagramDesigner Mediator.Instance.NotifyColleagues("DoneDrawingMessage", true); - if (sourceConnector != null) + if (SourceConnector != null) { - ConnectorInfoBase sourceDataItem = sourceConnector.Info; - if (sinkConnector != null) + ConnectorInfoBase sourceDataItem = SourceConnector.Info; + if (SinkConnector != null && SinkConnector.Info?.DisableAttachTo == false) { - ConnectorInfoBase sinkDataItem = sinkConnector.Info; + ConnectorInfoBase sinkDataItem = SinkConnector.Info; _viewModel.Remove(partialConnection); _viewModel.AddItemCommand.Execute(new ConnectionViewModel(_viewModel, sourceDataItem, sinkDataItem, DrawMode, RouterMode)); @@ -481,8 +506,8 @@ namespace AIStudio.Wpf.DiagramDesigner } } - sourceConnector = null; - sinkConnector = null; + SourceConnector = null; + SinkConnector = null; partialConnection = null; if (_service.DrawModeViewModel.GetDrawMode() != DrawMode.DirectLine) diff --git a/AIStudio.Wpf.DiagramDesigner/Themes/ConnectorItem.xaml b/AIStudio.Wpf.DiagramDesigner/Themes/ConnectorItem.xaml index f1445ab..2a5dad9 100644 --- a/AIStudio.Wpf.DiagramDesigner/Themes/ConnectorItem.xaml +++ b/AIStudio.Wpf.DiagramDesigner/Themes/ConnectorItem.xaml @@ -40,6 +40,12 @@ + + + + + + diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs index 6c50a8a..ab203fe 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs @@ -640,6 +640,11 @@ namespace AIStudio.Wpf.DiagramDesigner } } + public override bool Verify() + { + return IsFullConnection == false || SourceConnectorInfo?.CanAttachTo(SinkConnectorInfo) == true; + } + private void UpdateArea() { Area = new RectangleBase(SourceA, SourceB); diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Connector/ConnectorInfoBase.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Connector/ConnectorInfoBase.cs index b1663fd..e2c3b8b 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Connector/ConnectorInfoBase.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Connector/ConnectorInfoBase.cs @@ -158,8 +158,21 @@ namespace AIStudio.Wpf.DiagramDesigner } } + private bool _disableAttachTo; + public bool DisableAttachTo + { + get + { + return _disableAttachTo; + } + set + { + SetProperty(ref _disableAttachTo, value); + } + } + public virtual bool CanAttachTo(ConnectorInfoBase port) - => port != this && !port.IsReadOnly; + => port != null && port != this && !port.IsReadOnly; #endregion } } diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs index be70f9d..fb0aa90 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs @@ -1367,7 +1367,7 @@ namespace AIStudio.Wpf.DiagramDesigner public bool AddVerify(SelectableDesignerItemViewModelBase item) { - if (item.InitData() == false) + if (item.Verify() == false) return false; return true; @@ -1462,7 +1462,7 @@ namespace AIStudio.Wpf.DiagramDesigner Remove(olditems); }, () => { - Add(olditems); + Add(olditems); }); } } @@ -3298,9 +3298,9 @@ namespace AIStudio.Wpf.DiagramDesigner { if (SearchCaseMatch == true) { - return input.Replace(searchtext, replcetext); + return input.Replace(searchtext, replcetext); } - else + else { return Regex.Replace(input, searchtext, replcetext, RegexOptions.IgnoreCase); } @@ -3362,22 +3362,38 @@ namespace AIStudio.Wpf.DiagramDesigner { if (connectorVertexType == ConnectorVertexType.Start) { - if (partialConnection.SourceConnectorInfo.Position.DistanceTo(port.Position) < DiagramOption.SnappingOption.SnappingRadius && - partialConnection.SinkConnectorInfo?.CanAttachTo(port) == true) + if (partialConnection.SourceConnectorInfo.Position.DistanceTo(port.Position) < DiagramOption.SnappingOption.SnappingRadius) { - port.DataItem.ShowConnectors = true; - port.BeAttachTo = true; - return port; + if (partialConnection.SinkConnectorInfo?.CanAttachTo(port) == true) + { + port.DataItem.ShowConnectors = true; + port.BeAttachTo = true; + return port; + } + else + { + port.DataItem.ShowConnectors = true; + port.DisableAttachTo = true; + return null; + } } } else if (connectorVertexType == ConnectorVertexType.End) { - if (partialConnection.SinkConnectorInfo.Position.DistanceTo(port.Position) < DiagramOption.SnappingOption.SnappingRadius && - partialConnection.SourceConnectorInfo?.CanAttachTo(port) == true) + if (partialConnection.SinkConnectorInfo.Position.DistanceTo(port.Position) < DiagramOption.SnappingOption.SnappingRadius) { - port.DataItem.ShowConnectors = true; - port.BeAttachTo = true; - return port; + if (partialConnection.SourceConnectorInfo?.CanAttachTo(port) == true) + { + port.DataItem.ShowConnectors = true; + port.BeAttachTo = true; + return port; + } + else + { + port.DataItem.ShowConnectors = true; + port.DisableAttachTo = true; + return null; + } } } } @@ -3393,12 +3409,20 @@ namespace AIStudio.Wpf.DiagramDesigner ClearNearPort(); foreach (var port in Items.OfType().ToList().SelectMany(n => n.Connectors)) { - if (partialConnection.OnGoingPosition.DistanceTo(port.Position) < DiagramOption.SnappingOption.SnappingRadius && - partialConnection.SourceConnectorInfoFully?.CanAttachTo(port) == true) + if (partialConnection.OnGoingPosition.DistanceTo(port.Position) < DiagramOption.SnappingOption.SnappingRadius) { port.DataItem.ShowConnectors = true; - port.BeAttachTo = true; - return port; + if (partialConnection.SourceConnectorInfo?.CanAttachTo(port) == true) + { + port.BeAttachTo = true; + return port; + } + else + { + port.DisableAttachTo = true; + return null; + } + } } @@ -3407,7 +3431,11 @@ namespace AIStudio.Wpf.DiagramDesigner public void ClearNearPort() { - Items.OfType().ToList().SelectMany(n => n.Connectors).Where(p => p.BeAttachTo == true).ToList().ForEach(p => p.BeAttachTo = false); + Items.OfType().ToList().SelectMany(n => n.Connectors).Where(p => p.BeAttachTo == true || p.DisableAttachTo == true).ToList() + .ForEach(p => { + p.DisableAttachTo = false; + p.BeAttachTo = false; + }); } #endregion } diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableDesignerItemViewModelBase.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableDesignerItemViewModelBase.cs index e59dcbd..9b836a0 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableDesignerItemViewModelBase.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableDesignerItemViewModelBase.cs @@ -60,7 +60,7 @@ namespace AIStudio.Wpf.DiagramDesigner base.LoadDesignerItemViewModel(designerbase); } - public virtual bool InitData() + public virtual bool Verify() { return true; } diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/ImageItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/ImageItemViewModel.cs index f79bb96..7cd59ec 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/ImageItemViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/ImageItemViewModel.cs @@ -195,7 +195,7 @@ namespace AIStudio.Wpf.DiagramDesigner this.ItemHeight = this.ImageHeight; } - public override bool InitData() + public override bool Verify() { if (string.IsNullOrEmpty(Icon)) return EditData(); diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/MediaItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/MediaItemViewModel.cs index ddbe0ea..cf8aded 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/MediaItemViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/MediaItemViewModel.cs @@ -82,7 +82,7 @@ namespace AIStudio.Wpf.DiagramDesigner EditData(); } - public override bool InitData() + public override bool Verify() { if (string.IsNullOrEmpty(Icon)) return EditData();