From 98392f377be1d6d73a9d0f56b25e9b25d6ff8512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=89=BE=E7=AB=B9?= Date: Sun, 12 Feb 2023 11:02:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=8B=E4=BB=B6Demo=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...iagramDesigner.Demo_dnbehyiu_wpftmp.csproj | 325 +++++++++++++++++ ...iagramDesigner.Demo_ik1a4bby_wpftmp.csproj | 328 ++++++++++++++++++ .../MainWindow.xaml | 1 + .../ViewModels/EventsViewModel.cs | 61 ++++ .../Views/EventsView.xaml | 16 + .../Views/EventsView.xaml.cs | 26 ++ .../Controls/DragThumb.cs | 13 +- .../BaseViewModel/DiagramViewModel.cs | 22 +- .../BaseViewModel/SelectableViewModelBase.cs | 1 + .../ViewModels/IDiagramViewModel.cs | 28 ++ 10 files changed, 808 insertions(+), 13 deletions(-) create mode 100644 AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo_dnbehyiu_wpftmp.csproj create mode 100644 AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo_ik1a4bby_wpftmp.csproj create mode 100644 AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/EventsViewModel.cs create mode 100644 AIStudio.Wpf.DiagramDesigner.Demo/Views/EventsView.xaml create mode 100644 AIStudio.Wpf.DiagramDesigner.Demo/Views/EventsView.xaml.cs diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo_dnbehyiu_wpftmp.csproj b/AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo_dnbehyiu_wpftmp.csproj new file mode 100644 index 0000000..7353760 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo_dnbehyiu_wpftmp.csproj @@ -0,0 +1,325 @@ + + + AIStudio.Wpf.DiagramDesigner.Demo + obj\Debug\ + obj\ + F:\aistudio.-wpf.-diagram\AIStudio.Wpf.DiagramDesigner.Demo\obj\ + <_TargetAssemblyProjectName>AIStudio.Wpf.DiagramDesigner.Demo + + + + WinExe + true + + + + + + + + + + + + + + + + + Code + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo_ik1a4bby_wpftmp.csproj b/AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo_ik1a4bby_wpftmp.csproj new file mode 100644 index 0000000..2e3f0f2 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo_ik1a4bby_wpftmp.csproj @@ -0,0 +1,328 @@ + + + AIStudio.Wpf.DiagramDesigner.Demo + obj\Debug\ + obj\ + F:\aistudio.-wpf.-diagram\AIStudio.Wpf.DiagramDesigner.Demo\obj\ + <_TargetAssemblyProjectName>AIStudio.Wpf.DiagramDesigner.Demo + + + + WinExe + true + + + + + + + + + + + + + + + + + Code + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml b/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml index e1fccd3..0cd7ab3 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml +++ b/AIStudio.Wpf.DiagramDesigner.Demo/MainWindow.xaml @@ -7,6 +7,7 @@ mc:Ignorable="d" Title="AIStudio.Wpf.DiagramDesigner.Demo" Icon="A.ico" + Identifier="RootWindow" Style="{StaticResource AIStudio.Styles.WindowBase}" Height="450" Width="800"> diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/EventsViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/EventsViewModel.cs new file mode 100644 index 0000000..d7e3608 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/EventsViewModel.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows; +using AIStudio.Wpf.Controls; + +namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels +{ + class EventsViewModel : BaseViewModel + { + public EventsViewModel() + { + Title = "Events"; + Info = "The current available events are: NodeAdded, NodeRemoved, SelectionChanged, LinkAdded, LinkAttached and LinkRemoved." + + "Also, the Diagram and every Model have a Changed event."; + + 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" }; + 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.ClearSelectedItemsCommand.Execute(null); + DiagramViewModel.Event += DiagramViewModel_Event; + } + + private void DiagramViewModel_Event(object sender, DiagramEventArgs e) + { + var selectable = sender as SelectableViewModelBase; + Notice.Show("", + $"{sender.GetType().Name}:{selectable?.Id},{e.PropertyName},new:{e.NewValue},old:{e.OldValue}", + 3, + ControlStatus.Mid, + NoticeCardStyle.Plain, + 800, + 30, + HorizontalAlignment.Left, + VerticalAlignment.Bottom, + false, + true, + null, + "RootWindow"); + } + } +} diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/Views/EventsView.xaml b/AIStudio.Wpf.DiagramDesigner.Demo/Views/EventsView.xaml new file mode 100644 index 0000000..f0bbb41 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/Views/EventsView.xaml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/Views/EventsView.xaml.cs b/AIStudio.Wpf.DiagramDesigner.Demo/Views/EventsView.xaml.cs new file mode 100644 index 0000000..41edbf6 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/Views/EventsView.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 +{ + /// + /// EventsView.xaml 的交互逻辑 + /// + public partial class EventsView : UserControl + { + public EventsView() + { + InitializeComponent(); + } + } +} diff --git a/AIStudio.Wpf.DiagramDesigner/Controls/DragThumb.cs b/AIStudio.Wpf.DiagramDesigner/Controls/DragThumb.cs index 491ee46..3c032bc 100644 --- a/AIStudio.Wpf.DiagramDesigner/Controls/DragThumb.cs +++ b/AIStudio.Wpf.DiagramDesigner/Controls/DragThumb.cs @@ -20,8 +20,10 @@ namespace AIStudio.Wpf.DiagramDesigner.Controls private List designerItems; + private bool drag; private void DragThumb_DragStarted(object sender, DragStartedEventArgs e) { + drag = false; SelectableDesignerItemViewModelBase designerItem = this.DataContext as SelectableDesignerItemViewModelBase; if (designerItem != null && designerItem.IsSelected) @@ -56,17 +58,19 @@ namespace AIStudio.Wpf.DiagramDesigner.Controls designerItems = null; } } - + private void DragThumb_DragCompleted(object sender, DragCompletedEventArgs e) { + if (drag == false) return; + if (designerItems != null) { foreach (DesignerItemViewModelBase item in designerItems.OfType()) - { + { item.SetCellAlignment(); item.BeginDo = false; item.RaiseTopLeft(); - } + } e.Handled = true; } @@ -74,10 +78,11 @@ namespace AIStudio.Wpf.DiagramDesigner.Controls void DragThumb_DragDelta(object sender, DragDeltaEventArgs e) { + drag = true; if (designerItems != null) { double minLeft = double.MaxValue; - double minTop = double.MaxValue; + double minTop = double.MaxValue; foreach (DesignerItemViewModelBase item in designerItems.OfType()) { diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs index d9f8a1c..0c43f77 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs @@ -129,7 +129,7 @@ namespace AIStudio.Wpf.DiagramDesigner { Size size = _pageSize; switch (PageSizeType) - { + { case PageSizeType.A3: size = new Size(297, 420); break; case PageSizeType.A4: size = new Size(210, 297); break; case PageSizeType.A5: size = new Size(148, 210); break; @@ -230,7 +230,7 @@ namespace AIStudio.Wpf.DiagramDesigner } set { - _gridCellSize.Height = value; + _gridCellSize.Height = value; RaisePropertyChanged(nameof(PhysicalGridCellHeight)); RaisePropertyChanged(nameof(GridCellSize)); } @@ -682,7 +682,10 @@ namespace AIStudio.Wpf.DiagramDesigner } #endregion - private DoCommandManager DoCommandManager = new DoCommandManager(); + private DoCommandManager DoCommandManager = new DoCommandManager(); + + public event DiagramEventHandler Event; + public DiagramViewModel() { CreateNewDiagramCommand = new SimpleCommand(ExecuteEnable, ExecuteCreateNewDiagramCommand); @@ -727,7 +730,7 @@ namespace AIStudio.Wpf.DiagramDesigner Items.CollectionChanged += Items_CollectionChanged; } - public DiagramViewModel(DiagramItem diagramItem) :this() + public DiagramViewModel(DiagramItem diagramItem) : this() { DiagramType = diagramItem.DiagramType; ShowGrid = diagramItem.ShowGrid; @@ -741,7 +744,7 @@ namespace AIStudio.Wpf.DiagramDesigner GridColor = diagramItem.GridColor; } - public bool ExecuteEnable(object para) + public bool ExecuteEnable(object para) { return IsReadOnly == false; } @@ -815,13 +818,18 @@ namespace AIStudio.Wpf.DiagramDesigner if (designer.BeginDo) return; } + var selectable = sender as SelectableViewModelBase; + if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs) { var property = sender.GetType().GetProperty(e.PropertyName); var attr = property.GetCustomAttributes(typeof(CanDoAttribute), true); if (attr != null && attr.Length != 0) { + //加入ReDo DoCommandManager.DoNewCommand(sender.ToString() + e.PropertyName, () => Do(sender, e.PropertyName, valuePropertyChangedEventArgs.NewValue), () => UnDo(sender, e.PropertyName, valuePropertyChangedEventArgs.OldValue), null, false); + + Event?.Invoke(sender, new DiagramEventArgs(valuePropertyChangedEventArgs.PropertyName, valuePropertyChangedEventArgs.NewValue, valuePropertyChangedEventArgs.OldValue, selectable?.Id)); } } } @@ -1922,8 +1930,4 @@ namespace AIStudio.Wpf.DiagramDesigner } } - - - - } diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableViewModelBase.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableViewModelBase.cs index 6a7580d..7881c78 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableViewModelBase.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableViewModelBase.cs @@ -146,6 +146,7 @@ namespace AIStudio.Wpf.DiagramDesigner private bool _isSelected; [Browsable(false)] + [CanDo] public bool IsSelected { get diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/IDiagramViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/IDiagramViewModel.cs index fa64ccc..b4382e2 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/IDiagramViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/IDiagramViewModel.cs @@ -182,6 +182,8 @@ namespace AIStudio.Wpf.DiagramDesigner get; } + event DiagramEventHandler Event; + Func OutAddVerify { get; set; @@ -294,4 +296,30 @@ namespace AIStudio.Wpf.DiagramDesigner event PropertyChangedEventHandler PropertyChanged; } + + public delegate void DiagramEventHandler(object sender, DiagramEventArgs e); + + public class DiagramEventArgs : PropertyChangedEventArgs + { + public DiagramEventArgs(string propertyName, object oldValue, object newValue, Guid? id) : base(propertyName) + { + OldValue = oldValue; + NewValue = newValue; + Id = id; + } + + public object OldValue + { + get; set; + } + public object NewValue + { + get; set; + } + public Guid? Id + { + get; set; + } + + } }