From 5b513370ff359d83ead85f8edf59d1d4e91e9895 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=89=BE=E7=AB=B9?= Date: Sat, 4 Feb 2023 20:21:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BF=AB=E6=8D=B7=E9=94=AE=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controls/TitleControl.xaml | 2 +- .../MainWindow.xaml.cs | 5 +- .../Groups/CustomShortcutGroupViewModel.cs | 43 +++++++++ ...GroupingViewModel.cs => GroupViewModel.cs} | 4 +- .../Views/Groups/CustomShortcutGroupView.xaml | 16 ++++ .../Groups/CustomShortcutGroupView.xaml.cs | 26 ++++++ .../{GroupingView.xaml => GroupView.xaml} | 2 +- ...GroupingView.xaml.cs => GroupView.xaml.cs} | 4 +- .../Controls/DesignerCanvas.cs | 28 +----- .../UserControls/DiagramControl.xaml.cs | 92 ++++++++++++++++++- .../ViewModels/BaseViewModel/DiagramOption.cs | 92 +++++++++++++++++++ .../BaseViewModel/DiagramViewModel.cs | 49 ++++++---- .../ViewModels/IDiagramViewModel.cs | 14 ++- 13 files changed, 318 insertions(+), 59 deletions(-) create mode 100644 AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/CustomShortcutGroupViewModel.cs rename AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/{GroupingViewModel.cs => GroupViewModel.cs} (96%) create mode 100644 AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/CustomShortcutGroupView.xaml create mode 100644 AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/CustomShortcutGroupView.xaml.cs rename AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/{GroupingView.xaml => GroupView.xaml} (98%) rename AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/{GroupingView.xaml.cs => GroupView.xaml.cs} (86%) create mode 100644 AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramOption.cs diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/Controls/TitleControl.xaml b/AIStudio.Wpf.DiagramDesigner.Demo/Controls/TitleControl.xaml index ec58c18..1954865 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/Controls/TitleControl.xaml +++ b/AIStudio.Wpf.DiagramDesigner.Demo/Controls/TitleControl.xaml @@ -6,7 +6,7 @@ xmlns:ac="https://gitee.com/akwkevin/AI-wpf-controls" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> - + diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml.cs b/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml.cs index 6cd79bc..fe8111d 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml.cs @@ -81,8 +81,9 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo new MenuItemViewModel(){Title = "Groups", Children=new List { - new MenuItemViewModel(){Title = "Grouping"}, + new MenuItemViewModel(){Title = "Group"}, new MenuItemViewModel(){Title = "CustomDefinedGroup"}, + new MenuItemViewModel(){Title = "CustomShortcutGroup"}, } }, new MenuItemViewModel(){Title = "Customization", @@ -106,7 +107,7 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo new MenuItemViewModel(){Title = "PathAnimation"}, new MenuItemViewModel(){Title = "LineAnimation"}, } - }, + }, new MenuItemViewModel(){Title = "Editor", Children=new List { diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/CustomShortcutGroupViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/CustomShortcutGroupViewModel.cs new file mode 100644 index 0000000..c557cdd --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/CustomShortcutGroupViewModel.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows; +using System.Windows.Input; + +namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels +{ + class CustomShortcutGroupViewModel : BaseViewModel + { + public CustomShortcutGroupViewModel() + { + Title = "Custom Shortcut"; + Info = "You can customize what needs to be pressed to group selected nodes. CTRL+SHIFT+K in this example."; + + 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; + DiagramViewModel.DiagramOption.ShortcutOption.Group = e => e.KeyboardDevice.Modifiers == (ModifierKeys.Control | ModifierKeys.Shift) && e.Key == Key.K; + + 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/Groups/GroupingViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/GroupViewModel.cs similarity index 96% rename from AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/GroupingViewModel.cs rename to AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/GroupViewModel.cs index db930c8..ee5ad1f 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/GroupingViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Groups/GroupViewModel.cs @@ -5,9 +5,9 @@ using System.Windows; namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels { - class GroupingViewModel : BaseViewModel + class GroupViewModel : BaseViewModel { - public GroupingViewModel() + public GroupViewModel() { Title = "Grouping"; Info = "You can (un)group nodes using CTRL+ALT+G.
" + diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/CustomShortcutGroupView.xaml b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/CustomShortcutGroupView.xaml new file mode 100644 index 0000000..fb1c878 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/CustomShortcutGroupView.xaml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/CustomShortcutGroupView.xaml.cs b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/CustomShortcutGroupView.xaml.cs new file mode 100644 index 0000000..7823e93 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/CustomShortcutGroupView.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 +{ + /// + /// CustomShortcutGroupView.xaml 的交互逻辑 + /// + public partial class CustomShortcutGroupView : UserControl + { + public CustomShortcutGroupView() + { + InitializeComponent(); + } + } +} diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/GroupingView.xaml b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/GroupView.xaml similarity index 98% rename from AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/GroupingView.xaml rename to AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/GroupView.xaml index a0e9bbb..16c8395 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/GroupingView.xaml +++ b/AIStudio.Wpf.DiagramDesigner.Demo/Views/Groups/GroupView.xaml @@ -1,4 +1,4 @@ - /// GroupingView.xaml 的交互逻辑 /// - public partial class GroupingView : UserControl + public partial class GroupView : UserControl { - public GroupingView() + public GroupView() { InitializeComponent(); } diff --git a/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs b/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs index 5683c36..fd7efef 100644 --- a/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs +++ b/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs @@ -188,7 +188,6 @@ namespace AIStudio.Wpf.DiagramDesigner public DesignerCanvas() { - this.Focusable = true; this.AllowDrop = true; Mediator.Instance.Register(this); @@ -500,32 +499,7 @@ namespace AIStudio.Wpf.DiagramDesigner sourceConnectorInfo = null; _service.DrawModeViewModel.ResetDrawMode(); - } - - protected override void OnPreviewKeyDown(KeyEventArgs e) - { - base.OnPreviewKeyDown(e); - - bool executed = true; - var para = e.KeyboardDevice.Modifiers == ModifierKeys.None ? e.Key.ToString() : e.KeyboardDevice.Modifiers.ToString() + "+" + e.Key.ToString(); - - switch (para) - { - case "Control+A": _viewModel.SelectAllCommand.Execute(null); break; - case "Control+C": _viewModel.CopyCommand.Execute(null); break; - case "Control+V": _viewModel.PasteCommand.Execute(null); break; - case "Control+X": _viewModel.CutCommand.Execute(null); break; - case "Control+Z": _viewModel.UndoCommand.Execute(null); break; - case "Control+Y": _viewModel.RedoCommand.Execute(null); break; - case "Delete": _viewModel.DeleteCommand.Execute(null); break; - case "Left": _viewModel.LeftMoveCommand.Execute(null); break; - case "Right": _viewModel.RightMoveCommand.Execute(null); break; - case "Up": _viewModel.UpMoveCommand.Execute(null); break; - case "Down": _viewModel.DownMoveCommand.Execute(null); break; - default: executed = false; break; - } - e.Handled = executed; - } + } protected override Size MeasureOverride(Size constraint) { diff --git a/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml.cs b/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml.cs index d7ebc2b..1ce69d9 100644 --- a/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml.cs +++ b/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml.cs @@ -27,6 +27,8 @@ namespace AIStudio.Wpf.DiagramDesigner { this.Resources.MergedDictionaries.Add(ResourceDictionary); } + + this.Focusable = true; } public static readonly DependencyProperty ResourceDictionaryProperty = DependencyProperty.Register(nameof(ResourceDictionary), typeof(ResourceDictionary), typeof(DiagramControl), new UIPropertyMetadata(null, OnResourceDictionaryChanged)); @@ -71,9 +73,7 @@ namespace AIStudio.Wpf.DiagramDesigner private void DesignerCanvas_Loaded(object sender, RoutedEventArgs e) { //DesignerCanvas myDesignerCanvas = sender as DesignerCanvas; - //zoomBox.DesignerCanvas = myDesignerCanvas; - - + //zoomBox.DesignerCanvas = myDesignerCanvas; } private async void ScaleTransform_Changed(object sender, EventArgs e) @@ -81,5 +81,91 @@ namespace AIStudio.Wpf.DiagramDesigner await System.Threading.Tasks.Task.Delay(100); ZoomValue = scale.ScaleX; } + + private IDiagramViewModel DiagramViewModel + { + get + { + return DataContext as IDiagramViewModel; + } + } + + protected override void OnPreviewKeyDown(KeyEventArgs e) + { + base.OnPreviewKeyDown(e); + + if (DiagramViewModel.DiagramOption.ShortcutOption.SelectAll(e)) + { + DiagramViewModel.SelectAllCommand.Execute(null); + e.Handled = true; + return; + } + else if (DiagramViewModel.DiagramOption.ShortcutOption.Copy(e)) + { + DiagramViewModel.CopyCommand.Execute(null); + e.Handled = true; + return; + } + else if (DiagramViewModel.DiagramOption.ShortcutOption.Paste(e)) + { + DiagramViewModel.PasteCommand.Execute(null); + e.Handled = true; + return; + } + else if (DiagramViewModel.DiagramOption.ShortcutOption.Cut(e)) + { + DiagramViewModel.CutCommand.Execute(null); + e.Handled = true; + return; + } + else if (DiagramViewModel.DiagramOption.ShortcutOption.Undo(e)) + { + DiagramViewModel.UndoCommand.Execute(null); + e.Handled = true; + return; + } + else if (DiagramViewModel.DiagramOption.ShortcutOption.Redo(e)) + { + DiagramViewModel.RedoCommand.Execute(null); + e.Handled = true; + return; + } + else if (DiagramViewModel.DiagramOption.ShortcutOption.Delete(e)) + { + DiagramViewModel.DeleteCommand.Execute(null); + e.Handled = true; + return; + } + else if (DiagramViewModel.DiagramOption.ShortcutOption.LeftMove(e)) + { + DiagramViewModel.LeftMoveCommand.Execute(null); + e.Handled = true; + return; + } + else if (DiagramViewModel.DiagramOption.ShortcutOption.RightMove(e)) + { + DiagramViewModel.RightMoveCommand.Execute(null); + e.Handled = true; + return; + } + else if (DiagramViewModel.DiagramOption.ShortcutOption.UpMove(e)) + { + DiagramViewModel.UpMoveCommand.Execute(null); + e.Handled = true; + return; + } + else if (DiagramViewModel.DiagramOption.ShortcutOption.DownMove(e)) + { + DiagramViewModel.DownMoveCommand.Execute(null); + e.Handled = true; + return; + } + else if (DiagramViewModel.DiagramOption.ShortcutOption.Group(e)) + { + DiagramViewModel.GroupCommand.Execute(null); + e.Handled = true; + return; + } + } } } diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramOption.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramOption.cs new file mode 100644 index 0000000..e022c71 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramOption.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Text; +using System.Windows.Input; + +namespace AIStudio.Wpf.DiagramDesigner +{ + public class DiagramOption + { + public ShortcutOption ShortcutOption + { + get; set; + } = new ShortcutOption(); + } + + public class ShortcutOption + { + [Description("Select All shortcut (CTRL+A by default)")] + public Func SelectAll + { + get; set; + } = e => e.KeyboardDevice.Modifiers == ModifierKeys.Control && e.Key == Key.A; + + [Description("Copy shortcut (CTRL+C by default)")] + public Func Copy + { + get; set; + } = e => e.KeyboardDevice.Modifiers == ModifierKeys.Control && e.Key == Key.C; + + [Description("Paste shortcut (CTRL+V by default)")] + public Func Paste + { + get; set; + } = e => e.KeyboardDevice.Modifiers == ModifierKeys.Control && e.Key == Key.V; + + [Description("Cut shortcut (CTRL+X by default)")] + public Func Cut + { + get; set; + } = e => e.KeyboardDevice.Modifiers == ModifierKeys.Control && e.Key == Key.X; + + [Description("Undo shortcut (CTRL+Z by default)")] + public Func Undo + { + get; set; + } = e => e.KeyboardDevice.Modifiers == ModifierKeys.Control && e.Key == Key.Z; + + [Description("Undo shortcut (CTRL+Y by default)")] + public Func Redo + { + get; set; + } = e => e.KeyboardDevice.Modifiers == ModifierKeys.Control && e.Key == Key.Y; + + [Description("Delete shortcut (Delete by default)")] + public Func Delete + { + get; set; + } = e => e.KeyboardDevice.Modifiers == ModifierKeys.None && e.Key == Key.Delete; + + [Description("Left Move shortcut (Left by default)")] + public Func LeftMove + { + get; set; + } = e => e.KeyboardDevice.Modifiers == ModifierKeys.None && e.Key == Key.Left; + + [Description("Right Move shortcut (Right by default)")] + public Func RightMove + { + get; set; + } = e => e.KeyboardDevice.Modifiers == ModifierKeys.None && e.Key == Key.Right; + + [Description("Up Move shortcut (Up by default)")] + public Func UpMove + { + get; set; + } = e => e.KeyboardDevice.Modifiers == ModifierKeys.None && e.Key == Key.Up; + + [Description("Down Move shortcut (Down by default)")] + public Func DownMove + { + get; set; + } = e => e.KeyboardDevice.Modifiers == ModifierKeys.None && e.Key == Key.Down; + + [Description("Group Keyboard shortcut (CTRL+Shift+G by default)")] + public Func Group + { + get; set; + } = e => e.KeyboardDevice.Modifiers == (ModifierKeys.Control | ModifierKeys.Shift) && e.Key == Key.G; + + } +} diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs index a88efb4..125b1d9 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs @@ -4,7 +4,6 @@ using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Reactive.Linq; -using System.Runtime.InteropServices; using System.Windows; using System.Windows.Input; using System.Windows.Media; @@ -408,6 +407,11 @@ namespace AIStudio.Wpf.DiagramDesigner } } + public DiagramOption DiagramOption + { + get; set; + } = new DiagramOption(); + /// /// 用于wpf大小与物理像素之间转换 /// @@ -1460,7 +1464,7 @@ namespace AIStudio.Wpf.DiagramDesigner } } - DirectAddItemCommand.Execute(items); + OffsetX += 10; OffsetY += 10; @@ -1476,11 +1480,11 @@ namespace AIStudio.Wpf.DiagramDesigner connectionItem.SourceType = System.Type.GetType(connectionItem.SourceTypeName); connectionItem.SinkType = System.Type.GetType(connectionItem.SinkTypeName); - DesignerItemViewModelBase sourceItem = GetConnectorDataItem(this, connectionItem.SourceId, connectionItem.SourceType); + DesignerItemViewModelBase sourceItem = DiagramViewModelHelper.GetConnectorDataItem(items, connectionItem.SourceId, connectionItem.SourceType); ConnectorOrientation sourceConnectorOrientation = connectionItem.SourceOrientation; FullyCreatedConnectorInfo sourceConnectorInfo = sourceItem.GetFullConnectorInfo(connectionItem.Id, sourceConnectorOrientation, connectionItem.SourceXRatio, connectionItem.SourceYRatio, connectionItem.SourceInnerPoint, connectionItem.SourceIsPortless); - DesignerItemViewModelBase sinkItem = GetConnectorDataItem(this, connectionItem.SinkId, connectionItem.SinkType); + DesignerItemViewModelBase sinkItem = DiagramViewModelHelper.GetConnectorDataItem(items, connectionItem.SinkId, connectionItem.SinkType); ConnectorOrientation sinkConnectorOrientation = connectionItem.SinkOrientation; FullyCreatedConnectorInfo sinkConnectorInfo = sinkItem.GetFullConnectorInfo(connectionItem.Id, sinkConnectorOrientation, connectionItem.SinkXRatio, connectionItem.SinkYRatio, connectionItem.SinkInnerPoint, connectionItem.SinkIsPortless); @@ -1488,8 +1492,6 @@ namespace AIStudio.Wpf.DiagramDesigner connectors.Add(connectionVM); } - DirectAddItemCommand.Execute(connectors); - //修复父级的引用 foreach (var item in items) { @@ -1499,19 +1501,17 @@ namespace AIStudio.Wpf.DiagramDesigner item.ParentId = mappingOldToNewIDs[item.ParentId]; } } + + items.AddRange(connectors); + + DirectAddItemCommand.Execute(items); } catch (Exception e) { System.Windows.MessageBox.Show(e.StackTrace, e.Message, System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error); } } - } - - private DesignerItemViewModelBase GetConnectorDataItem(IDiagramViewModel diagramViewModel, Guid conectorDataItemId, Type connectorDataItemType) - { - DesignerItemViewModelBase dataItem = diagramViewModel.Items.OfType().Single(x => x.Id == conectorDataItemId); - return dataItem; - } + } private bool ItemsToDeleteHasConnector(List itemsToRemove, ConnectorInfoBase connector) { @@ -1678,7 +1678,16 @@ namespace AIStudio.Wpf.DiagramDesigner } else { - items = SelectedItems.OfType().Where(p => p.ParentId == Guid.Empty).ToList(); + items = SelectedItems?.OfType().Where(p => p.ParentId == Guid.Empty).ToList(); + } + + var groups = items.OfType().Where(p => p.IsGroup && p.ParentId == Guid.Empty).ToList(); + + //解除分组 + if (groupItem == null && groups.Count > 0) + { + ExecuteUngroupCommand(groups); + return; } RectangleBase rect = GetBoundingRectangle(items); @@ -1706,9 +1715,15 @@ namespace AIStudio.Wpf.DiagramDesigner private void ExecuteUngroupCommand(object parameter) { - var groups = (from item in SelectedItems.OfType() - where item.IsGroup && item.ParentId == Guid.Empty - select item).ToArray(); + List groups; + if (parameter is IEnumerable para) + { + groups = para.ToList(); + } + else + { + groups = SelectedItems?.OfType().Where(p => p.IsGroup && p.ParentId == Guid.Empty).ToList(); + } foreach (DesignerItemViewModelBase groupRoot in groups) { diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/IDiagramViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/IDiagramViewModel.cs index fc613a9..76b6b27 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/IDiagramViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/IDiagramViewModel.cs @@ -1,11 +1,10 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Collections.ObjectModel; -using System.Windows; -using System.Windows.Media; using System.ComponentModel; +using System.Windows; +using System.Windows.Input; +using System.Windows.Media; namespace AIStudio.Wpf.DiagramDesigner { @@ -267,6 +266,13 @@ namespace AIStudio.Wpf.DiagramDesigner get; set; } #endregion + + #region 设置选项 + DiagramOption DiagramOption + { + get; set; + } + #endregion //用于wpf大小与物理像素之间转换 double ScreenScale {