diff --git a/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml b/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml index c9f8d4c..e6ff2f6 100644 --- a/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml +++ b/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml @@ -1139,14 +1139,14 @@ Format="0 pt" /> - + - + + - + + RenderTransformOrigin="0.5,0.5"> @@ -1190,6 +1191,8 @@ + + diff --git a/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml b/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml index aad7ab7..4c87c8a 100644 --- a/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml +++ b/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml @@ -559,20 +559,19 @@ Data="{Binding ColorViewModel.RightArrowPathStyle,Converter={StaticResource ArrowPathConverter}}" Visibility="{Binding Path=IsFullConnection, Converter={x:Static s:BoolToVisibilityConverter.Instance}}" Fill="{Binding ColorViewModel.LineColor,Converter={StaticResource ColorBrushConverter}}" - HorizontalAlignment="Left" Height="{Binding ColorViewModel.RightArrowSizeStyle, Converter={StaticResource ArrowSizeConverter}}" Width="{Binding ColorViewModel.RightArrowSizeStyle, Converter={StaticResource ArrowSizeConverter}}" - Canvas.Left="{Binding EndPoint.X}" - Canvas.Top="{Binding EndPoint.Y}" - Stretch="Fill" - Stroke="{Binding ColorViewModel.LineColor,Converter={StaticResource ColorBrushConverter}}" - VerticalAlignment="Top" + Stretch="Fill" + Stroke="{Binding ColorViewModel.LineColor,Converter={StaticResource ColorBrushConverter}}" RenderTransformOrigin="0.5,0.5"> - + + + + - - + + + @@ -662,60 +662,12 @@ Value="Visible"/> - - - - - - - - - - - - - + - - - - - - - - - - - - diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectorViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectorViewModel.cs index 53c24c7..e0b3f16 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectorViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectorViewModel.cs @@ -37,6 +37,7 @@ namespace AIStudio.Wpf.DiagramDesigner private void Init(FullyCreatedConnectorInfo sourceConnectorInfo, ConnectorInfoBase sinkConnectorInfo) { this.Parent = sourceConnectorInfo.DataItem.Parent; + if (Parent != null && Parent.ColorViewModel != null) { this.ColorViewModel = CopyHelper.Mapper(Parent.ColorViewModel); @@ -45,6 +46,7 @@ namespace AIStudio.Wpf.DiagramDesigner { this.ColorViewModel.RightArrowPathStyle = ArrowPathStyle.None; } + ColorViewModel.PropertyChanged += ColorViewModel_PropertyChanged; var routetype = GlobalType.AllTypes.Where(p => typeof(IRouter).IsAssignableFrom(p)).FirstOrDefault(p => p.Name == RouterMode); Router = routetype != null ? (System.Activator.CreateInstance(routetype) as IRouter) : new RouterNormal(); @@ -55,7 +57,18 @@ namespace AIStudio.Wpf.DiagramDesigner this.SourceConnectorInfo = sourceConnectorInfo; this.SinkConnectorInfo = sinkConnectorInfo; DeleteConnectionCommand = new SimpleCommand(DeleteConnection); - AddVertexCommand = new SimpleCommand(AddVertex); + AddVertexCommand = new SimpleCommand(AddVertex); + } + + private void ColorViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(ColorViewModel.LeftArrowPathStyle) || + e.PropertyName == nameof(ColorViewModel.LeftArrowSizeStyle) || + e.PropertyName == nameof(ColorViewModel.RightArrowPathStyle) || + e.PropertyName == nameof(ColorViewModel.RightArrowSizeStyle)) + { + UpdatePathGeneratorResult(); + } } public override SelectableDesignerItemBase ToXmlObject() @@ -200,7 +213,7 @@ namespace AIStudio.Wpf.DiagramDesigner RectangleBase oldarea = _area; if (SetProperty(ref _area, value)) { - UpdateConnectionPoints(); + UpdatePathGeneratorResult(); OutTextItemLocation(oldarea, value); } } @@ -343,7 +356,7 @@ namespace AIStudio.Wpf.DiagramDesigner Area = new RectangleBase(SourceA, SourceB); } - private void UpdateConnectionPoints() + private void UpdatePathGeneratorResult() { if (SourceConnectorInfo == null || SinkConnectorInfo == null) return; @@ -351,17 +364,77 @@ namespace AIStudio.Wpf.DiagramDesigner var route = Router.Get(Parent, this); (var source, var target) = FindConnectionPoints(route); - if (source == null || target == null) - return; + if (source == null || target == null) + return; PathGeneratorResult = PathGenerator.Get(Parent, this, route, source.Value, target.Value); - - StartPoint = new PointBase(source.Value.X - Area.Left, source.Value.Y - Area.Top); - EndPoint = new PointBase(target.Value.X - Area.Left, target.Value.Y - Area.Top); + + //修正旋转 + switch (SourceConnectorInfo.Orientation) + { + case ConnectorOrientation.Left: + { + StartPoint = new PointBase(PathGeneratorResult.SourceMarkerPosition.X, PathGeneratorResult.SourceMarkerPosition.Y - ColorViewModel.LeftArrowSize / 2); + break; + } + case ConnectorOrientation.Top: + { + StartPoint = new PointBase(PathGeneratorResult.SourceMarkerPosition.X - ColorViewModel.LeftArrowSize / 2, PathGeneratorResult.SourceMarkerPosition.Y); + break; + } + case ConnectorOrientation.Right: + { + StartPoint = new PointBase(PathGeneratorResult.SourceMarkerPosition.X - ColorViewModel.LeftArrowSize, PathGeneratorResult.SourceMarkerPosition.Y - ColorViewModel.LeftArrowSize / 2); + break; + } + case ConnectorOrientation.Bottom: + { + StartPoint = new PointBase(PathGeneratorResult.SourceMarkerPosition.X - ColorViewModel.LeftArrowSize / 2, PathGeneratorResult.SourceMarkerPosition.Y - ColorViewModel.LeftArrowSize); + break; + } + default: + { + StartPoint = PathGeneratorResult.SourceMarkerPosition; + break; + } + } + + //修正旋转 + switch (SinkConnectorInfo.Orientation) + { + case ConnectorOrientation.Left: + { + EndPoint = new PointBase(PathGeneratorResult.TargetMarkerPosition.X, PathGeneratorResult.TargetMarkerPosition.Y - ColorViewModel.RightArrowSize / 2); + break; } + + case ConnectorOrientation.Top: + { + EndPoint = new PointBase(PathGeneratorResult.TargetMarkerPosition.X - ColorViewModel.RightArrowSize / 2, PathGeneratorResult.TargetMarkerPosition.Y); + break; + } + case ConnectorOrientation.Right: + { + EndPoint = new PointBase(PathGeneratorResult.TargetMarkerPosition.X - ColorViewModel.RightArrowSize, PathGeneratorResult.TargetMarkerPosition.Y - ColorViewModel.RightArrowSize / 2); + break; + } + case ConnectorOrientation.Bottom: + { + EndPoint = new PointBase(PathGeneratorResult.TargetMarkerPosition.X - ColorViewModel.RightArrowSize / 2, PathGeneratorResult.TargetMarkerPosition.Y - ColorViewModel.RightArrowSize); + break; + } + default: + { + EndPoint = PathGeneratorResult.TargetMarkerPosition; + break; + } + } + StartAngle = PathGeneratorResult.SourceMarkerAngle; EndAngle = PathGeneratorResult.TargetMarkerAngle; } + + private void ConnectorViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) { switch (e.PropertyName) @@ -415,7 +488,7 @@ namespace AIStudio.Wpf.DiagramDesigner { MouseButtonEventArgs mosueArg = ((EventToCommandArgs)parameter).EventArgs as MouseButtonEventArgs; var position = mosueArg.GetPosition(((EventToCommandArgs)parameter).Sender as IInputElement); - + ConnectionPoints.Add(new ConnectorPoint(position.X, position.Y)); if (!((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control))