diff --git a/AIStudio.Wpf.DiagramApp/ViewModels/MainWindowViewModel.cs b/AIStudio.Wpf.DiagramApp/ViewModels/MainWindowViewModel.cs index bb4b657..2ecb996 100644 --- a/AIStudio.Wpf.DiagramApp/ViewModels/MainWindowViewModel.cs +++ b/AIStudio.Wpf.DiagramApp/ViewModels/MainWindowViewModel.cs @@ -53,7 +53,6 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels { HistoryList = new ObservableCollection(); } - this.PropertyChanged += MainWindowViewModel_PropertyChanged; _service.PropertyChanged += Provider_PropertyChanged; } @@ -410,11 +409,6 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels } } - private void MainWindowViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) - { - - } - private void Provider_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { if (e.PropertyName == nameof(DrawModeViewModel) diff --git a/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml b/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml index 225b18c..68548c1 100644 --- a/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml +++ b/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml @@ -1308,7 +1308,7 @@ - + + /// 该拷贝不完整,只适应于工具栏使用 + /// + /// + /// + /// public static T Mapper(T s) where T : SelectableViewModelBase { if (s == null) return null; T d = Activator.CreateInstance(s.GetType()) as T; + d.IsLoaded = false; var properties = s.GetType().GetProperties(); foreach (var propertie in properties) { @@ -158,6 +166,7 @@ namespace AIStudio.Wpf.DiagramDesigner d.FontViewModel = CopyHelper.Mapper(s.FontViewModel); d.ShapeViewModel = CopyHelper.Mapper(s.ShapeViewModel); d.LockObjectViewModel = CopyHelper.Mapper(s.LockObjectViewModel); + d.IsLoaded = true; return d; } diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs index fef634c..4978c29 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs @@ -18,22 +18,27 @@ namespace AIStudio.Wpf.DiagramDesigner /// public class ConnectionViewModel : SelectableDesignerItemViewModelBase { + public ConnectionViewModel() + { + + } + public ConnectionViewModel(FullyCreatedConnectorInfo sourceConnectorInfo, ConnectorInfoBase sinkConnectorInfo, DrawMode drawMode = DrawMode.ConnectingLineSmooth, RouterMode routerMode = AIStudio.Wpf.DiagramDesigner.RouterMode.RouterNormal) : this(null, sourceConnectorInfo, sinkConnectorInfo, drawMode, routerMode) { } public ConnectionViewModel(IDiagramViewModel root, FullyCreatedConnectorInfo sourceConnectorInfo, ConnectorInfoBase sinkConnectorInfo, DrawMode drawMode = DrawMode.ConnectingLineSmooth, RouterMode routerMode = AIStudio.Wpf.DiagramDesigner.RouterMode.RouterNormal) : base(root) - { - PathMode = drawMode.ToString(); - RouterMode = routerMode.ToString(); + { + _pathMode = drawMode.ToString(); + _routerMode = routerMode.ToString(); Init(root, sourceConnectorInfo, sinkConnectorInfo); } public ConnectionViewModel(IDiagramViewModel root, FullyCreatedConnectorInfo sourceConnectorInfo, FullyCreatedConnectorInfo sinkConnectorInfo, ConnectionItem designer) : base(root, designer) { - PathMode = designer.PathMode; - RouterMode = designer.RouterMode; + _pathMode = designer.PathMode; + _routerMode = designer.RouterMode; Init(root, sourceConnectorInfo, sinkConnectorInfo); } @@ -53,34 +58,26 @@ namespace AIStudio.Wpf.DiagramDesigner protected virtual void Init(IDiagramViewModel root, FullyCreatedConnectorInfo sourceConnectorInfo, ConnectorInfoBase sinkConnectorInfo) { - this.Root = root?? sourceConnectorInfo.Root; - + IsLoaded = false; + this.Root = root ?? sourceConnectorInfo.Root; if (sinkConnectorInfo is FullyCreatedConnectorInfo sink && sink.DataItem.ShowArrow == false) { this.ShapeViewModel.SinkMarker = new LinkMarker("", 10, 10, ArrowPathStyle.None, ArrowSizeStyle.Middle); - } - this.ColorViewModel.PropertyChanged += ConnectorViewModel_PropertyChanged; - this.ShapeViewModel.PropertyChanged += ConnectorViewModel_PropertyChanged; - this.PropertyChanged += ConnectorViewModel_PropertyChanged; - + } var routetype = TypeHelper.GetType(RouterMode); Router = routetype != null ? (System.Activator.CreateInstance(routetype) as IRouter) : new RouterNormal(); - var pathGeneratortype = TypeHelper.GetType(PathMode); PathGenerator = pathGeneratortype != null ? (System.Activator.CreateInstance(pathGeneratortype) as IPathGenerator) : new ConnectingLineSmooth(); + IsLoaded= true; this.SourceConnectorInfo = sourceConnectorInfo; this.SinkConnectorInfo = sinkConnectorInfo; + DeleteConnectionCommand = new SimpleCommand(Command_Enable, DeleteConnection); AddVertexCommand = new SimpleCommand(Command_Enable, AddVertex); AddLabelCommand = new SimpleCommand(Command_Enable, para => AddLabel()); } - protected override void InitNew() - { - base.InitNew(); - } - protected override void LoadDesignerItemViewModel(SelectableItemBase designerbase) { base.LoadDesignerItemViewModel(designerbase); @@ -448,8 +445,10 @@ namespace AIStudio.Wpf.DiagramDesigner } #endregion - private void ConnectorViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) + protected override void Item_PropertyChanged(object sender, PropertyChangedEventArgs e) { + if (IsLoaded == false) return; + if (sender is ConnectionViewModel) { switch (e.PropertyName) @@ -464,20 +463,20 @@ namespace AIStudio.Wpf.DiagramDesigner case nameof(Vertices): foreach (var vertice in Vertices) { - vertice.PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler; + vertice.PropertyChanged += new WeakINPCEventHandler(Item_PropertyChanged).Handler; } break; case nameof(Labels): foreach (var label in Labels) { - label.PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler; + label.PropertyChanged += new WeakINPCEventHandler(Item_PropertyChanged).Handler; } break; case nameof(SourceConnectorInfo): if (SourceConnectorInfo != null) { SourceA = PointHelper.GetPointForConnector(SourceConnectorInfo); - SourceConnectorInfo.DataItem.PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler; + SourceConnectorInfo.DataItem.PropertyChanged += new WeakINPCEventHandler(Item_PropertyChanged).Handler; } break; case nameof(SinkConnectorInfo): @@ -486,7 +485,7 @@ namespace AIStudio.Wpf.DiagramDesigner SourceB = SinkConnectorInfo.Position; if (IsFullConnection) { - SinkConnectorInfoFully.DataItem.PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler; + SinkConnectorInfoFully.DataItem.PropertyChanged += new WeakINPCEventHandler(Item_PropertyChanged).Handler; } } break; @@ -572,7 +571,7 @@ namespace AIStudio.Wpf.DiagramDesigner } else if (sender is ColorViewModel) { - + } } @@ -595,7 +594,7 @@ namespace AIStudio.Wpf.DiagramDesigner PathGeneratorResult = PathGenerator.Get(Root, this, route, source.Value, target.Value); var startMiddle = new RectangleBase - ( + ( (PathGeneratorResult.SourceMarkerPosition.X + (source.Value.X - Area.Left)) / 2, (PathGeneratorResult.SourceMarkerPosition.Y + (source.Value.Y - Area.Top)) / 2, 0, @@ -820,7 +819,7 @@ namespace AIStudio.Wpf.DiagramDesigner pointBase = new PointBase(pointBase.X - Area.Left, pointBase.Y - Area.Top); } var vertice = new ConnectorVertexModel(this, pointBase); - vertice.PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler; + vertice.PropertyChanged += new WeakINPCEventHandler(Item_PropertyChanged).Handler; Vertices.Add(vertice); UpdatePathGeneratorResult(); } @@ -839,7 +838,7 @@ namespace AIStudio.Wpf.DiagramDesigner public void AddLabel(string text = null, double? distance = null, PointBase? offset = null) { var label = new ConnectorLabelModel(this, text?.ToString(), distance, offset); - label.PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler; + label.PropertyChanged += new WeakINPCEventHandler(Item_PropertyChanged).Handler; label.IsSelected = true; Labels.Add(label); diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableViewModelBase.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableViewModelBase.cs index 7ff2d06..76a826b 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableViewModelBase.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableViewModelBase.cs @@ -129,7 +129,7 @@ namespace AIStudio.Wpf.DiagramDesigner ShapeViewModel = CopyHelper.Mapper(designerbase.SharpItem); } - protected bool IsLoaded + public bool IsLoaded { get;set; } @@ -424,7 +424,7 @@ namespace AIStudio.Wpf.DiagramDesigner if (IsLoaded == false) { return; } } - protected virtual void FontViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + protected void FontViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { if (IsLoaded == false) { return; } @@ -436,14 +436,14 @@ namespace AIStudio.Wpf.DiagramDesigner RaisePropertyChanged(sender, e); } - protected virtual void ColorViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + protected void ColorViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { if (IsLoaded == false) { return; } RaisePropertyChanged(sender, e); } - protected virtual void ShapeViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + protected void ShapeViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { if (IsLoaded == false) { return; } diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/ImageItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/ImageItemViewModel.cs index 5aaee3c..f79bb96 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/ImageItemViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/ImageItemViewModel.cs @@ -45,8 +45,6 @@ namespace AIStudio.Wpf.DiagramDesigner { base.Init(root, initNew); - this.PropertyChanged += ImageItemViewModel_PropertyChanged; - BuildMenuOptions(); } @@ -66,8 +64,10 @@ namespace AIStudio.Wpf.DiagramDesigner } } - private void ImageItemViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + protected override void Item_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { + if (this.IsLoaded == false) return; + if (e.PropertyName == nameof(ItemWidth) || e.PropertyName == nameof(ItemHeight) || e.PropertyName == nameof(ResizeMargin) || e.PropertyName == nameof(ClipMode)) { RaisePropertyChanged(nameof(Object)); diff --git a/AIStudio.Wpf.Mind/ViewModels/MindNode.cs b/AIStudio.Wpf.Mind/ViewModels/MindNode.cs index 70788e5..af4a8ba 100644 --- a/AIStudio.Wpf.Mind/ViewModels/MindNode.cs +++ b/AIStudio.Wpf.Mind/ViewModels/MindNode.cs @@ -99,12 +99,11 @@ namespace AIStudio.Wpf.Mind.ViewModels public void InitLayout(bool initAppearance) { + IsLoaded = false; var layout = TypeHelper.GetType(this.MindType.ToString() + "Layout"); MindLayout = layout != null ? (System.Activator.CreateInstance(layout) as IMindLayout) : new MindLayout(); - - this.PropertyChanged -= this.Item_PropertyChanged; MindLayout.Appearance(this, MindTheme, initAppearance); - this.PropertyChanged += this.Item_PropertyChanged; + IsLoaded = true; } public void InitConnectionLayout() @@ -559,7 +558,7 @@ namespace AIStudio.Wpf.Mind.ViewModels public void RemoveFrom() { - this.PropertyChanged -= Item_PropertyChanged; + this.IsLoaded = false; if (this.ParentNode != null) { this.ParentNode.Children.Remove(this); @@ -572,8 +571,10 @@ namespace AIStudio.Wpf.Mind.ViewModels #endregion #region 属性改变 - private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e) + protected override void Item_PropertyChanged(object sender, PropertyChangedEventArgs e) { + if (IsLoaded == false) return; + if (GetLevel0Node()?.LayoutUpdating == true) return; Interlocked.Increment(ref Root.DoCommandManager.BeginDo); @@ -600,7 +601,7 @@ namespace AIStudio.Wpf.Mind.ViewModels case nameof(ItemWidth): case nameof(ItemHeight): { - + UpdatedLayout(); break; } @@ -617,17 +618,12 @@ namespace AIStudio.Wpf.Mind.ViewModels SetItemWidthHeight(); break; } + case nameof(FontViewModel.FontSize): + SetItemWidthHeight(); + break; } Interlocked.Decrement(ref Root.DoCommandManager.BeginDo); } - - protected override void FontViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) - { - if (e.PropertyName == nameof(FontViewModel.FontSize)) - { - SetItemWidthHeight(); - } - } #endregion #region 布局相关