diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/A.ico b/AIStudio.Wpf.DiagramDesigner.Demo/A.ico new file mode 100644 index 0000000..b02b588 Binary files /dev/null and b/AIStudio.Wpf.DiagramDesigner.Demo/A.ico differ diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo.csproj b/AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo.csproj index ade4264..e51ccd7 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo.csproj +++ b/AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo.csproj @@ -6,6 +6,11 @@ + + + + + @@ -14,4 +19,12 @@ + + + + + + + + diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/App.xaml b/AIStudio.Wpf.DiagramDesigner.Demo/App.xaml index 53a6e84..b4d2d46 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/App.xaml +++ b/AIStudio.Wpf.DiagramDesigner.Demo/App.xaml @@ -60,6 +60,10 @@ + + + + diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml b/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml index 7423cc4..9ec7384 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml +++ b/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml @@ -1,11 +1,14 @@ - + Title="AIStudio.Wpf.DiagramDesigner.Demo" + Icon="A.ico" + Style="{StaticResource AIStudio.Styles.WindowBase}" + Height="450" Width="800"> @@ -20,4 +23,4 @@ Grid.Column="1" Margin="0" /> - + diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml.cs b/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml.cs index 3bded18..e50c90f 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml.cs @@ -12,6 +12,7 @@ using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; +using AIStudio.Wpf.Controls; using AIStudio.Wpf.DiagramDesigner.Demo.ViewModels; namespace AIStudio.Wpf.DiagramDesigner.Demo @@ -19,7 +20,7 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo /// /// Interaction logic for MainWindow.xaml /// - public partial class MainWindow : Window + public partial class MainWindow : WindowBase { #region Identity private static IDictionary _viewDic; diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Base/BaseViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Base/BaseViewModel.cs index 4299d1c..01574ea 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Base/BaseViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Base/BaseViewModel.cs @@ -28,5 +28,15 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels { get; set; } + + public int Index + { + get; set; + } + + public int ParentIndex + { + get; set; + } } } diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/CustomNodeViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/CustomNodeViewModel.cs index 4922dc9..c136b60 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/CustomNodeViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/CustomNodeViewModel.cs @@ -36,6 +36,7 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels ConnectionViewModel connector2 = new ConnectionViewModel(node2.BottomConnector, node3.BottomConnector, DrawMode.ConnectingLineStraight, RouterMode.RouterOrthogonal); DiagramViewModel.DirectAddItemCommand.Execute(connector2); + DiagramViewModel.ClearSelectedItemsCommand.Execute(null); } } diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Customization/ThickLinkViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Customization/ThickLinkViewModel.cs new file mode 100644 index 0000000..40c72fc --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Customization/ThickLinkViewModel.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Text; +using System.Windows; + +namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels +{ + class ThickLinkViewModel : BaseViewModel + { + public ThickLinkViewModel() + { + Title = "Custom link"; + Info = "Creating your own custom links is very easy!"; + + _service.ColorViewModel.FillColor.Color = System.Windows.Media.Colors.Orange; + + DiagramViewModel = new DiagramViewModel(); + DiagramViewModel.PageSizeType = PageSizeType.Custom; + DiagramViewModel.PageSize = new Size(double.NaN, double.NaN); + + DefaultDesignerItemViewModel node1 = new DefaultDesignerItemViewModel() { Left = 50, Top = 50, Text = "1" }; + DiagramViewModel.DirectAddItemCommand.Execute(node1); + + DefaultDesignerItemViewModel node2 = new DefaultDesignerItemViewModel() { Left = 300, Top = 300, Text = "2" }; + DiagramViewModel.DirectAddItemCommand.Execute(node2); + + DefaultDesignerItemViewModel node3 = new DefaultDesignerItemViewModel() { Left = 300, Top = 50, Text = "3" }; + DiagramViewModel.DirectAddItemCommand.Execute(node3); + + ConnectionViewModel connector1 = new ConnectionViewModel(node1.RightConnector, node2.LeftConnector, DrawMode.ConnectingLineSmooth, RouterMode.RouterNormal); + connector1.ColorViewModel.LineWidth = 6; + connector1.ColorViewModel.LineColor.BrushType = BrushType.LinearGradientBrush; + connector1.ColorViewModel.LineColor.GradientStop = new ObservableCollection(); + connector1.ColorViewModel.LineColor.GradientStop.Add(new GradientStop(System.Windows.Media.Colors.Red, 0)); + connector1.ColorViewModel.LineColor.GradientStop.Add(new GradientStop(System.Windows.Media.Colors.Gray, 1)); + DiagramViewModel.DirectAddItemCommand.Execute(connector1); + + ConnectionViewModel connector2 = new ConnectionViewModel(node2.RightConnector, node3.RightConnector, DrawMode.ConnectingLineStraight, RouterMode.RouterOrthogonal); + connector2.ColorViewModel.LineWidth = 6; + connector2.ColorViewModel.LineColor.Color = System.Windows.Media.Colors.Blue; + DiagramViewModel.DirectAddItemCommand.Execute(connector2); + + DiagramViewModel.ClearSelectedItemsCommand.Execute(null); + } + } +} diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/GroupingViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/GroupingViewModel.cs new file mode 100644 index 0000000..cebd8cb --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/GroupingViewModel.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows; + +namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels +{ + class GroupingViewModel : BaseViewModel + { + public GroupingViewModel() + { + Title = "Simple"; + Info = "A simple example of AIStudio.Wpf.DiagramDesigner."; + + _service.ColorViewModel.FillColor.Color = System.Windows.Media.Colors.Orange; + + DiagramViewModel = new DiagramViewModel(); + DiagramViewModel.PageSizeType = PageSizeType.Custom; + DiagramViewModel.PageSize = new Size(double.NaN, double.NaN); + + DefaultDesignerItemViewModel node1 = new DefaultDesignerItemViewModel() { Left = 50, Top = 50, Text = "1" }; + DiagramViewModel.DirectAddItemCommand.Execute(node1); + + DefaultDesignerItemViewModel node2 = new DefaultDesignerItemViewModel() { Left = 300, Top = 300, Text = "2" }; + DiagramViewModel.DirectAddItemCommand.Execute(node2); + + DefaultDesignerItemViewModel node3 = new DefaultDesignerItemViewModel() { Left = 300, Top = 50, Text = "3" }; + DiagramViewModel.DirectAddItemCommand.Execute(node3); + + ConnectionViewModel connector1 = new ConnectionViewModel(node1.RightConnector, node2.LeftConnector, DrawMode.ConnectingLineSmooth, RouterMode.RouterNormal); + DiagramViewModel.DirectAddItemCommand.Execute(connector1); + + ConnectionViewModel connector2 = new ConnectionViewModel(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/Links/LabelsViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/LabelsViewModel.cs index 9dead39..546ad16 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/LabelsViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/LabelsViewModel.cs @@ -61,6 +61,8 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels connector1.AddLabel("(0,-20)", 50, new Point(0, -20)); connector1.AddLabel("(0,20)", -50, new Point(0, 20)); DiagramViewModel.DirectAddItemCommand.Execute(connector1); + + DiagramViewModel.ClearSelectedItemsCommand.Execute(null); } } } diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/MarkersViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/MarkersViewModel.cs index 6efab81..ab83afd 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/MarkersViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/MarkersViewModel.cs @@ -78,6 +78,8 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels connector1.AddLabel("Custom"); DiagramViewModel.DirectAddItemCommand.Execute(connector1); + DiagramViewModel.ClearSelectedItemsCommand.Execute(null); + } } } diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/PathGeneratorsViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/PathGeneratorsViewModel.cs index 22a7e5e..26f281f 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/PathGeneratorsViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/PathGeneratorsViewModel.cs @@ -35,6 +35,8 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels ConnectionViewModel connector2 = new ConnectionViewModel(node2.RightConnector, node3.LeftConnector, DrawMode.ConnectingLineSmooth, RouterMode.RouterNormal); connector2.AddLabel("Smooth"); DiagramViewModel.DirectAddItemCommand.Execute(connector2); + + DiagramViewModel.ClearSelectedItemsCommand.Execute(null); } } } diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/RoutersViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/RoutersViewModel.cs index 406bb2d..e3570b8 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/RoutersViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/RoutersViewModel.cs @@ -35,6 +35,8 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels ConnectionViewModel connector2 = new ConnectionViewModel(node2.RightConnector, node3.LeftConnector, DrawMode.ConnectingLineStraight, RouterMode.RouterOrthogonal); connector2.AddLabel("Orthogonal"); DiagramViewModel.DirectAddItemCommand.Execute(connector2); + + DiagramViewModel.ClearSelectedItemsCommand.Execute(null); } } } \ No newline at end of file diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/SnappingViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/SnappingViewModel.cs index 4962f2b..5edf68a 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/SnappingViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/SnappingViewModel.cs @@ -17,7 +17,7 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels DiagramViewModel = new DiagramViewModel(); DiagramViewModel.PageSizeType = PageSizeType.Custom; DiagramViewModel.PageSize = new Size(double.NaN, double.NaN); - DiagramViewModel.EnableSnapping = true; + DiagramViewModel.DrawModeViewModel = new DrawModeViewModel() { EnableSnapping = true }; DefaultDesignerItemViewModel node1 = new DefaultDesignerItemViewModel() { Left = 50, Top = 50, Text = "1" }; DiagramViewModel.DirectAddItemCommand.Execute(node1); @@ -27,6 +27,8 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels DefaultDesignerItemViewModel node3 = new DefaultDesignerItemViewModel() { Left = 300, Top = 50, Text = "3" }; DiagramViewModel.DirectAddItemCommand.Execute(node3); + + DiagramViewModel.ClearSelectedItemsCommand.Execute(null); } } } diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/VerticesViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/VerticesViewModel.cs new file mode 100644 index 0000000..7243acd --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/VerticesViewModel.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows; + +namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels +{ + class VerticesViewModel : BaseViewModel + { + public VerticesViewModel() + { + Title = "Link Vertices"; + Info = "Click on a link to create a vertex. Double click on a vertex to delete it. " + + "You can drag the vertices around."; + + _service.ColorViewModel.FillColor.Color = System.Windows.Media.Colors.Orange; + + DiagramViewModel = new DiagramViewModel(); + DiagramViewModel.PageSizeType = PageSizeType.Custom; + DiagramViewModel.PageSize = new Size(double.NaN, double.NaN); + + DefaultDesignerItemViewModel node1 = new DefaultDesignerItemViewModel() { Left = 50, Top = 80, Text = "1" }; + DiagramViewModel.DirectAddItemCommand.Execute(node1); + + DefaultDesignerItemViewModel node2 = new DefaultDesignerItemViewModel() { Left = 200, Top = 350, Text = "2" }; + DiagramViewModel.DirectAddItemCommand.Execute(node2); + + DefaultDesignerItemViewModel node3 = new DefaultDesignerItemViewModel() { Left = 400, Top = 100, Text = "3" }; + DiagramViewModel.DirectAddItemCommand.Execute(node3); + + ConnectionViewModel connector1 = new ConnectionViewModel(node1.RightConnector, node2.LeftConnector, DrawMode.ConnectingLineStraight, RouterMode.RouterNormal); + connector1.AddLabel("Content"); + connector1.AddVertex(new Point(221, 112.5)); + connector1.AddVertex(new Point(111, 291)); + DiagramViewModel.DirectAddItemCommand.Execute(connector1); + + ConnectionViewModel connector2 = new ConnectionViewModel(node2.RightConnector, node3.LeftConnector, DrawMode.ConnectingLineSmooth, RouterMode.RouterNormal); + connector2.AddLabel("Content"); + connector2.AddVertex(new Point(400, 324)); + connector2.AddVertex(new Point(326, 180)); + DiagramViewModel.DirectAddItemCommand.Execute(connector2); + + + DiagramViewModel.ClearSelectedItemsCommand.Execute(null); + } + } +} diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/LockedViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/LockedViewModel.cs index 39dc56f..e139c22 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/LockedViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/LockedViewModel.cs @@ -48,6 +48,7 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels connector2.IsReadOnly = true; DiagramViewModel.DirectAddItemCommand.Execute(connector2); + DiagramViewModel.ClearSelectedItemsCommand.Execute(null); } } } diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Nodes/SvgViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Nodes/SvgViewModel.cs new file mode 100644 index 0000000..a8c55b8 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Nodes/SvgViewModel.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows; +using AIStudio.Wpf.DiagramDesigner.Additionals.Extensions.ViewModels; + +namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels +{ + class SvgViewModel : BaseViewModel + { + public SvgViewModel() + { + Title = "Custom node"; + Info = "Creating your own custom design is very easy!"; + + //_service.ColorViewModel.FillColor.Color = System.Windows.Media.Colors.Orange; + + DiagramViewModel = new DiagramViewModel(); + DiagramViewModel.CellHorizontalAlignment = CellHorizontalAlignment.Center; + DiagramViewModel.CellVerticalAlignment = CellVerticalAlignment.Center; + DiagramViewModel.PageSizeType = PageSizeType.Custom; + DiagramViewModel.PageSize = new Size(double.NaN, double.NaN); + + DefaultDesignerItemViewModel node1 = new DefaultDesignerItemViewModel() { Left = 50, Top = 50, Text = "1" }; + DiagramViewModel.DirectAddItemCommand.Execute(node1); + + PathItemViewModel node2 = new PathItemViewModel() { Left = 300, Top = 300, Icon = "M 0 -50 L 50 -50 L 50 -10 A 1 1 0 0 0 50 10 L 50 50 L 0 50 L 0 10 A 1 1 0 0 0 0 -10 Z" }; + DiagramViewModel.DirectAddItemCommand.Execute(node2); + + PathItemViewModel node3 = new PathItemViewModel() { Left = 300, Top = 50, Icon = "M 0 -50 L 50 -50 L 50 -10 A 1 1 0 0 0 50 10 L 50 50 L 0 50 L 0 10 A 1 1 0 0 0 0 -10 Z" }; + DiagramViewModel.DirectAddItemCommand.Execute(node3); + + ConnectionViewModel connector1 = new ConnectionViewModel(node1.RightConnector, node2.TopConnector, DrawMode.ConnectingLineSmooth, RouterMode.RouterNormal); + DiagramViewModel.DirectAddItemCommand.Execute(connector1); + + ConnectionViewModel connector2 = new ConnectionViewModel(node2.BottomConnector, node3.BottomConnector, DrawMode.ConnectingLineStraight, RouterMode.RouterOrthogonal); + DiagramViewModel.DirectAddItemCommand.Execute(connector2); + + DiagramViewModel.ClearSelectedItemsCommand.Execute(null); + } + } +} diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/PerformanceViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/PerformanceViewModel.cs index 0a0d827..33e8914 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/PerformanceViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/PerformanceViewModel.cs @@ -31,6 +31,8 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels DiagramViewModel.DirectAddItemCommand.Execute(connector1); } } + + DiagramViewModel.ClearSelectedItemsCommand.Execute(null); } } } diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/ReconnectLinksToClosestPortsViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/ReconnectLinksToClosestPortsViewModel.cs index ffffc8d..c560025 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/ReconnectLinksToClosestPortsViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/ReconnectLinksToClosestPortsViewModel.cs @@ -35,6 +35,8 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels DiagramViewModel.DirectAddItemCommand.Execute(connector2); ReconnectLinksCommand = new SimpleCommand(ReconnectLinks); + + DiagramViewModel.ClearSelectedItemsCommand.Execute(null); } public SimpleCommand ReconnectLinksCommand diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/SimpleViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/SimpleViewModel.cs index 87d9e83..e79cc18 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/SimpleViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/SimpleViewModel.cs @@ -32,6 +32,8 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels ConnectionViewModel connector2 = new ConnectionViewModel(node2.RightConnector, node3.RightConnector, DrawMode.ConnectingLineStraight, RouterMode.RouterOrthogonal); DiagramViewModel.DirectAddItemCommand.Execute(connector2); + + DiagramViewModel.ClearSelectedItemsCommand.Execute(null); } } } diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/SnapToGridViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/SnapToGridViewModel.cs index 6ddbcc7..f7ab25d 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/SnapToGridViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/SnapToGridViewModel.cs @@ -35,6 +35,7 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels ConnectionViewModel connector2 = new ConnectionViewModel(node2.RightConnector, node3.RightConnector, DrawMode.ConnectingLineStraight, RouterMode.RouterOrthogonal); DiagramViewModel.DirectAddItemCommand.Execute(connector2); + DiagramViewModel.ClearSelectedItemsCommand.Execute(null); } } } diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/ZoomViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/ZoomViewModel.cs index d5854bb..73f5c97 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/ZoomViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/ZoomViewModel.cs @@ -33,6 +33,7 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels ConnectionViewModel connector2 = new ConnectionViewModel(node2.RightConnector, node3.RightConnector, DrawMode.ConnectingLineStraight, RouterMode.RouterOrthogonal); DiagramViewModel.DirectAddItemCommand.Execute(connector2); + DiagramViewModel.ClearSelectedItemsCommand.Execute(null); } } } diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/Views/Customization/ThickLinkView.xaml b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Customization/ThickLinkView.xaml new file mode 100644 index 0000000..1c7f390 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Customization/ThickLinkView.xaml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/Views/Customization/ThickLinkView.xaml.cs b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Customization/ThickLinkView.xaml.cs new file mode 100644 index 0000000..a4f3320 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Customization/ThickLinkView.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 +{ + /// + /// ThickLinkView.xaml 的交互逻辑 + /// + public partial class ThickLinkView : UserControl + { + public ThickLinkView() + { + InitializeComponent(); + } + } +} diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/GroupingView.xaml b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/GroupingView.xaml new file mode 100644 index 0000000..8b37306 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/GroupingView.xaml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/GroupingView.xaml.cs b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/GroupingView.xaml.cs new file mode 100644 index 0000000..8bd69e0 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/GroupingView.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 +{ + /// + /// GroupingView.xaml 的交互逻辑 + /// + public partial class GroupingView : UserControl + { + public GroupingView() + { + InitializeComponent(); + } + } +} diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/Views/Links/VerticesView.xaml b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Links/VerticesView.xaml new file mode 100644 index 0000000..3ff2e5b --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Links/VerticesView.xaml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/Views/Links/VerticesView.xaml.cs b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Links/VerticesView.xaml.cs new file mode 100644 index 0000000..e278f87 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Links/VerticesView.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 +{ + /// + /// VerticesView.xaml 的交互逻辑 + /// + public partial class VerticesView : UserControl + { + public VerticesView() + { + InitializeComponent(); + } + } +} diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/Views/Nodes/SvgView.xaml b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Nodes/SvgView.xaml new file mode 100644 index 0000000..e673379 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Nodes/SvgView.xaml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/Views/Nodes/SvgView.xaml.cs b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Nodes/SvgView.xaml.cs new file mode 100644 index 0000000..e1c991c --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Nodes/SvgView.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 +{ + /// + /// SvgView.xaml 的交互逻辑 + /// + public partial class SvgView : UserControl + { + public SvgView() + { + InitializeComponent(); + } + } +} diff --git a/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs b/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs index e5c9ac0..a0efb74 100644 --- a/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs +++ b/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs @@ -41,7 +41,7 @@ namespace AIStudio.Wpf.DiagramDesigner { get { - if (_viewModel.DrawModeViewModel?.LineDrawMode != null) + if (_viewModel.DrawModeViewModel != null) { return _viewModel.DrawModeViewModel.LineDrawMode; } @@ -55,7 +55,7 @@ namespace AIStudio.Wpf.DiagramDesigner { get { - if (_viewModel.DrawModeViewModel?.LineRouterMode != null) + if (_viewModel.DrawModeViewModel != null) { return _viewModel.DrawModeViewModel.LineRouterMode; } @@ -70,7 +70,14 @@ namespace AIStudio.Wpf.DiagramDesigner { get { - return _viewModel.EnableSnapping; + if (_viewModel.DrawModeViewModel != null) + { + return _viewModel.DrawModeViewModel.EnableSnapping; + } + else + { + return _service.DrawModeViewModel.EnableSnapping; + } } } @@ -78,7 +85,14 @@ namespace AIStudio.Wpf.DiagramDesigner { get { - return _viewModel.SnappingRadius; + if (_viewModel.DrawModeViewModel != null) + { + return _viewModel.DrawModeViewModel.SnappingRadius; + } + else + { + return _service.DrawModeViewModel.SnappingRadius; + } } } diff --git a/AIStudio.Wpf.DiagramDesigner/StyleSelectors/DesignerItemsControlItemStyleSelector.cs b/AIStudio.Wpf.DiagramDesigner/StyleSelectors/DesignerItemsControlItemStyleSelector.cs index c19f7ec..e922031 100644 --- a/AIStudio.Wpf.DiagramDesigner/StyleSelectors/DesignerItemsControlItemStyleSelector.cs +++ b/AIStudio.Wpf.DiagramDesigner/StyleSelectors/DesignerItemsControlItemStyleSelector.cs @@ -49,7 +49,6 @@ namespace AIStudio.Wpf.DiagramDesigner if (item is DesignerItemViewModelBase) { - return (Style)itemsControl.FindResource("designerItemStyle"); } diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/DrawModeViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/DrawModeViewModel.cs index 501dc77..48a3601 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/DrawModeViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/DrawModeViewModel.cs @@ -186,5 +186,31 @@ namespace AIStudio.Wpf.DiagramDesigner } } + private bool _enableSnapping; + public bool EnableSnapping + { + get + { + return _enableSnapping; + } + set + { + SetProperty(ref _enableSnapping, value); + } + } + + private double _snappingRadius = 50; + public double SnappingRadius + { + get + { + return _snappingRadius; + } + set + { + SetProperty(ref _snappingRadius, value); + } + } + } } diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/Interface/IDrawModeViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/Interface/IDrawModeViewModel.cs index abf5772..acfbf89 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/Interface/IDrawModeViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/Interface/IDrawModeViewModel.cs @@ -25,5 +25,14 @@ namespace AIStudio.Wpf.DiagramDesigner { get; set; } + + bool EnableSnapping + { + get; set; + } + double SnappingRadius + { + get; set; + } } } diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs index 76137f5..abcbc82 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs @@ -53,7 +53,7 @@ namespace AIStudio.Wpf.DiagramDesigner protected virtual void Init(FullyCreatedConnectorInfo sourceConnectorInfo, ConnectorInfoBase sinkConnectorInfo) { this.Root = sourceConnectorInfo.DataItem.Root; - + this.ColorViewModel.FillColor.Color = Colors.Red; if (sinkConnectorInfo is FullyCreatedConnectorInfo sink && sink.DataItem.ShowArrow == false) { @@ -715,10 +715,7 @@ namespace AIStudio.Wpf.DiagramDesigner MouseButtonEventArgs mosueArg = ((EventToCommandArgs)parameter).EventArgs as MouseButtonEventArgs; var position = mosueArg.GetPosition(((EventToCommandArgs)parameter).Sender as IInputElement); - var vertice = new ConnectorVertexModel(this, new PointBase(position.X, position.Y)); - vertice.PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler; - Vertices.Add(vertice); - UpdatePathGeneratorResult(); + AddVertex(position, false); if (!((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)) { @@ -726,6 +723,18 @@ namespace AIStudio.Wpf.DiagramDesigner } } + public void AddVertex(PointBase pointBase, bool absolute = true) + { + if (absolute) + { + pointBase = new PointBase(pointBase.X - Area.Left, pointBase.Y - Area.Top); + } + var vertice = new ConnectorVertexModel(this, pointBase); + vertice.PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler; + Vertices.Add(vertice); + UpdatePathGeneratorResult(); + } + protected override void ExecuteEditCommand(object param) { AddLabel(); diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs index daf8d92..12bdf82 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs @@ -364,33 +364,7 @@ namespace AIStudio.Wpf.DiagramDesigner { SetProperty(ref _cellVerticalAlignment, value); } - } - - private bool _enableSnapping; - public bool EnableSnapping - { - get - { - return _enableSnapping; - } - set - { - SetProperty(ref _enableSnapping, value); - } - } - - private double _snappingRadius = 50; - public double SnappingRadius - { - get - { - return _snappingRadius; - } - set - { - SetProperty(ref _snappingRadius, value); - } - } + } private bool _isEditName; [Browsable(false)] @@ -786,7 +760,7 @@ namespace AIStudio.Wpf.DiagramDesigner ClearSelectedItems(); Add(ite); } - else if (parameter is List items) + else if (parameter is IEnumerable items) { if (items.Select(p => AddVerify(p)).Any() != true) return; @@ -1714,9 +1688,15 @@ namespace AIStudio.Wpf.DiagramDesigner #region 分组 private void ExecuteGroupCommand(object parameter) { - var items = from item in SelectedItems.OfType() - where item.ParentId == Guid.Empty - select item; + List items; + if (parameter is IEnumerable para) + { + items = para.ToList(); + } + else + { + items = SelectedItems.OfType().Where(p => p.ParentId == Guid.Empty).ToList(); + } RectangleBase rect = GetBoundingRectangle(items); diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/GroupDesignerItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/GroupDesignerItemViewModel.cs index 2d2e483..a0b3fcf 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/GroupDesignerItemViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/GroupDesignerItemViewModel.cs @@ -11,10 +11,21 @@ namespace AIStudio.Wpf.DiagramDesigner { public GroupDesignerItemViewModel() : base() { - this.ClearConnectors(); + + } + + protected override void Init() + { + base.Init(); + this.IsHitTestVisible = false; } + protected override void InitConnector() + { + + } + protected override void ExecuteEditCommand(object param) { } diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/IDiagramViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/IDiagramViewModel.cs index a594274..fc613a9 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/IDiagramViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/IDiagramViewModel.cs @@ -228,14 +228,6 @@ namespace AIStudio.Wpf.DiagramDesigner { get; set; } - bool EnableSnapping - { - get; set; - } - double SnappingRadius - { - get; set; - } Size GridMarginSize { get; set;