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;
+ }
+
+ }
}