From dfe76438c20bf8c8beffd4d64c1bee4f82f8bb5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=89=BE=E7=AB=B9?= Date: Mon, 13 Feb 2023 22:50:50 +0800 Subject: [PATCH] =?UTF-8?q?ZoomBox=E5=BE=85=E5=AE=8C=E6=88=90=EF=BC=8C?= =?UTF-8?q?=E8=BF=98=E9=9C=80=E8=A6=81=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewModels/PageViewModel.cs | 2 +- AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml | 83 ++++++++++--------- .../Converters/CountShiftConverter.cs | 2 +- .../Controls/ZoomBox.cs | 49 ++++++++--- .../Styles/ZoomBox.xaml | 14 ++-- .../UserControls/DiagramControl.xaml | 9 +- .../UserControls/DiagramControl.xaml.cs | 7 -- .../BaseViewModel/DiagramViewModel.cs | 24 ++++++ AIStudio.Wpf.Mind/ViewModels/MindNode.cs | 10 +++ 9 files changed, 132 insertions(+), 68 deletions(-) diff --git a/AIStudio.Wpf.DiagramApp/ViewModels/PageViewModel.cs b/AIStudio.Wpf.DiagramApp/ViewModels/PageViewModel.cs index 3ef6179..6c9d0a3 100644 --- a/AIStudio.Wpf.DiagramApp/ViewModels/PageViewModel.cs +++ b/AIStudio.Wpf.DiagramApp/ViewModels/PageViewModel.cs @@ -33,7 +33,7 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels DiagramViewModels = new ObservableCollection() { - new DiagramViewModel(){Name= "页-1", DiagramType = diagramType}, + new DiagramViewModel(){Name= "页-1", DiagramType = diagramType, ZoomValue = 0.8}, }; DiagramViewModel = DiagramViewModels.FirstOrDefault(); diff --git a/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml b/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml index 8038250..7f34f49 100644 --- a/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml +++ b/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml @@ -1843,58 +1843,67 @@ - + - - + - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AIStudio.Wpf.DiagramDesigner.Additionals/Converters/CountShiftConverter.cs b/AIStudio.Wpf.DiagramDesigner.Additionals/Converters/CountShiftConverter.cs index b797885..4fbfb8a 100644 --- a/AIStudio.Wpf.DiagramDesigner.Additionals/Converters/CountShiftConverter.cs +++ b/AIStudio.Wpf.DiagramDesigner.Additionals/Converters/CountShiftConverter.cs @@ -13,7 +13,7 @@ namespace AIStudio.Wpf.DiagramDesigner.Additionals.Converters { if (values != null && values.Length > 2) { - var diagram = values[0] as AIStudio.Wpf.DiagramDesigner.DiagramControl; + var diagram = values[0] as FrameworkElement; var zoomValue = (double)values[1]; var pageunit = (PageUnit)values[2]; var unit = Unit.Cm; diff --git a/AIStudio.Wpf.DiagramDesigner/Controls/ZoomBox.cs b/AIStudio.Wpf.DiagramDesigner/Controls/ZoomBox.cs index 1ea8a26..c78b8b2 100644 --- a/AIStudio.Wpf.DiagramDesigner/Controls/ZoomBox.cs +++ b/AIStudio.Wpf.DiagramDesigner/Controls/ZoomBox.cs @@ -4,6 +4,7 @@ using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Media; using System.Windows.Input; +using AIStudio.Wpf.DiagramDesigner.Helpers; namespace AIStudio.Wpf.DiagramDesigner { @@ -12,7 +13,6 @@ namespace AIStudio.Wpf.DiagramDesigner private Thumb zoomThumb; private Canvas zoomCanvas; private Slider zoomSlider; - private ScaleTransform scaleTransform; #region DPs @@ -24,7 +24,24 @@ namespace AIStudio.Wpf.DiagramDesigner } public static readonly DependencyProperty ScrollViewerProperty = - DependencyProperty.Register(nameof(ScrollViewer), typeof(ScrollViewer), typeof(ZoomBox)); + DependencyProperty.Register(nameof(ScrollViewer), typeof(ScrollViewer), typeof(ZoomBox), new FrameworkPropertyMetadata(null, + new PropertyChangedCallback(OnScrollViewerChanged))); + + private static void OnScrollViewerChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + ZoomBox target = (ZoomBox)d; + ScrollViewer oldvalue = (ScrollViewer)e.OldValue; + ScrollViewer newvalue = (ScrollViewer)e.NewValue; + target.OnScrollViewerChanged(oldvalue, newvalue); + } + + protected virtual void OnScrollViewerChanged(ScrollViewer oldvalue, ScrollViewer newvalue) + { + if (newvalue != null) + { + DesignerCanvas = VisualHelper.FindChild(newvalue); + } + } #endregion #region DesignerCanvas @@ -56,20 +73,33 @@ namespace AIStudio.Wpf.DiagramDesigner { if (oldDesignerCanvas != null) { - newDesignerCanvas.LayoutUpdated -= new EventHandler(this.DesignerCanvas_LayoutUpdated); - newDesignerCanvas.MouseWheel -= new MouseWheelEventHandler(this.DesignerCanvas_MouseWheel); + oldDesignerCanvas.LayoutUpdated -= new EventHandler(this.DesignerCanvas_LayoutUpdated); + oldDesignerCanvas.MouseWheel -= new MouseWheelEventHandler(this.DesignerCanvas_MouseWheel); } if (newDesignerCanvas != null) { newDesignerCanvas.LayoutUpdated += new EventHandler(this.DesignerCanvas_LayoutUpdated); newDesignerCanvas.MouseWheel += new MouseWheelEventHandler(this.DesignerCanvas_MouseWheel); - newDesignerCanvas.LayoutTransform = this.scaleTransform; } } #endregion + public static readonly DependencyProperty ZoomValueProperty = + DependencyProperty.Register(nameof(ZoomValue), typeof(double), typeof(ZoomBox), new UIPropertyMetadata(1d)); + public double ZoomValue + { + get + { + return (double)GetValue(ZoomValueProperty); + } + set + { + SetValue(ZoomValueProperty, value); + } + } + #endregion public override void OnApplyTemplate() @@ -79,6 +109,8 @@ namespace AIStudio.Wpf.DiagramDesigner if (this.ScrollViewer == null) return; + DesignerCanvas = VisualHelper.FindChild(this.ScrollViewer); + this.zoomThumb = Template.FindName("PART_ZoomThumb", this) as Thumb; if (this.zoomThumb == null) throw new Exception("PART_ZoomThumb template is missing!"); @@ -93,7 +125,6 @@ namespace AIStudio.Wpf.DiagramDesigner this.zoomThumb.DragDelta += new DragDeltaEventHandler(this.Thumb_DragDelta); this.zoomSlider.ValueChanged += new RoutedPropertyChangedEventHandler(this.ZoomSlider_ValueChanged); - this.scaleTransform = new ScaleTransform(); } private void ZoomSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) @@ -103,8 +134,6 @@ namespace AIStudio.Wpf.DiagramDesigner double newVerticalOffset = ((this.ScrollViewer.VerticalOffset + halfViewportHeight) * scale - halfViewportHeight); double halfViewportWidth = this.ScrollViewer.ViewportWidth / 2; double newHorizontalOffset = ((this.ScrollViewer.HorizontalOffset + halfViewportWidth) * scale - halfViewportWidth); - this.scaleTransform.ScaleX *= scale; - this.scaleTransform.ScaleY *= scale; this.ScrollViewer.ScrollToHorizontalOffset(newHorizontalOffset); this.ScrollViewer.ScrollToVerticalOffset(newVerticalOffset); } @@ -145,8 +174,8 @@ namespace AIStudio.Wpf.DiagramDesigner private void InvalidateScale(out double scale, out double xOffset, out double yOffset) { - double w = DesignerCanvas.ActualWidth * this.scaleTransform.ScaleX; - double h = DesignerCanvas.ActualHeight * this.scaleTransform.ScaleY; + double w = DesignerCanvas.ActualWidth * ZoomValue; + double h = DesignerCanvas.ActualHeight * ZoomValue; // zoom canvas size double x = this.zoomCanvas.ActualWidth; diff --git a/AIStudio.Wpf.DiagramDesigner/Styles/ZoomBox.xaml b/AIStudio.Wpf.DiagramDesigner/Styles/ZoomBox.xaml index 53efc24..7ed812c 100644 --- a/AIStudio.Wpf.DiagramDesigner/Styles/ZoomBox.xaml +++ b/AIStudio.Wpf.DiagramDesigner/Styles/ZoomBox.xaml @@ -181,7 +181,7 @@ Name="PART_ZoomCanvas"> + Visual="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DesignerCanvas}" /> @@ -212,12 +212,12 @@ VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0" - Ticks="25,50,75,100,125,150,200,300,400,500" - Minimum="25" - Maximum="500" - SmallChange="25" - LargeChange="25" - Value="100" + Ticks="0.25,0.50,0.75,1,1.25,1.50,2.00,3.00,4.00,5.00" + Minimum="0.25" + Maximum="5" + SmallChange="0.25" + LargeChange="0.25" + Value="{Binding ZoomValue,RelativeSource={RelativeSource Mode=TemplatedParent},Mode=TwoWay}" MinWidth="104" MinHeight="21" IsSnapToTickEnabled="True" diff --git a/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml b/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml index cfdcfb9..4bfa3a5 100644 --- a/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml +++ b/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml @@ -293,11 +293,7 @@ - - - - + @@ -837,6 +833,9 @@ GridColor="{Binding GridColor}" Background="{Binding PageBackground,Converter={StaticResource ColorBrushConverter}}" AllowDrop="{Binding AllowDrop}"> + + + diff --git a/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml.cs b/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml.cs index 9f68b1f..a10f671 100644 --- a/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml.cs +++ b/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml.cs @@ -69,19 +69,12 @@ namespace AIStudio.Wpf.DiagramDesigner } } - private void DesignerCanvas_Loaded(object sender, RoutedEventArgs e) { //DesignerCanvas myDesignerCanvas = sender as DesignerCanvas; //zoomBox.DesignerCanvas = myDesignerCanvas; } - private async void ScaleTransform_Changed(object sender, EventArgs e) - { - await System.Threading.Tasks.Task.Delay(100); - ZoomValue = scale.ScaleX; - } - private IDiagramViewModel DiagramViewModel { get diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs index c520068..6aedb00 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs @@ -400,6 +400,20 @@ namespace AIStudio.Wpf.DiagramDesigner } } + private double _delayZoomValue = 1; + [Browsable(false)] + public double DelayZoomValue + { + get + { + return _delayZoomValue; + } + set + { + SetProperty(ref _delayZoomValue, value); + } + } + private string _name; [Browsable(false)] public string Name @@ -691,6 +705,8 @@ namespace AIStudio.Wpf.DiagramDesigner public event DiagramEventHandler Event; + private IDisposable ZoomValueChangedSubscription; + public DiagramViewModel() { CreateNewDiagramCommand = new SimpleCommand(ExecuteEnable, ExecuteCreateNewDiagramCommand); @@ -733,6 +749,14 @@ namespace AIStudio.Wpf.DiagramDesigner Mediator.Instance.Register(this); Items.CollectionChanged += Items_CollectionChanged; + + ZoomValueChangedSubscription = WhenPropertyChanged.Where(o => o.ToString() == nameof(ZoomValue)).Throttle(TimeSpan.FromMilliseconds(100)).Subscribe(OnZoomValueChanged);//Sample + } + + //提供给标尺计算,延迟100ms,等布局改变再计算。 + private void OnZoomValueChanged(string obj) + { + DelayZoomValue = ZoomValue; } public DiagramViewModel(DiagramItem diagramItem) : this() diff --git a/AIStudio.Wpf.Mind/ViewModels/MindNode.cs b/AIStudio.Wpf.Mind/ViewModels/MindNode.cs index 8ea1976..75b1e31 100644 --- a/AIStudio.Wpf.Mind/ViewModels/MindNode.cs +++ b/AIStudio.Wpf.Mind/ViewModels/MindNode.cs @@ -45,6 +45,16 @@ namespace AIStudio.Wpf.Mind.ViewModels SetProperty(ref _cornerRadius, value); } } + + public double Spacing + { + get; set; + } + + public List Children + { + get; set; + } } public class MindLevel1Node : MindNode