diff --git a/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs b/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs index ce70b2d..04872b1 100644 --- a/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs +++ b/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs @@ -198,6 +198,7 @@ namespace AIStudio.Wpf.DiagramDesigner private void DesignerCanvas_Loaded(object sender, RoutedEventArgs e) { this.Focus(); + } protected override void OnRender(DrawingContext dc) diff --git a/AIStudio.Wpf.DiagramDesigner/Controls/ZoomBox.cs b/AIStudio.Wpf.DiagramDesigner/Controls/ZoomBox.cs index a804d17..f26f80c 100644 --- a/AIStudio.Wpf.DiagramDesigner/Controls/ZoomBox.cs +++ b/AIStudio.Wpf.DiagramDesigner/Controls/ZoomBox.cs @@ -42,7 +42,6 @@ namespace AIStudio.Wpf.DiagramDesigner new FrameworkPropertyMetadata(null, new PropertyChangedCallback(OnDesignerCanvasChanged))); - public FrameworkElement DesignerCanvas { get @@ -63,7 +62,6 @@ namespace AIStudio.Wpf.DiagramDesigner target.OnDesignerCanvasChanged(oldDesignerCanvas, newDesignerCanvas); } - protected virtual void OnDesignerCanvasChanged(FrameworkElement oldDesignerCanvas, FrameworkElement newDesignerCanvas) { if (oldDesignerCanvas != null) @@ -139,8 +137,77 @@ namespace AIStudio.Wpf.DiagramDesigner SetValue(MinimumZoomValueProperty, value); } } + + public static readonly DependencyProperty FitViewModelProperty = + DependencyProperty.Register(nameof(FitViewModel), typeof(FitViewModel), typeof(ZoomBox), + new FrameworkPropertyMetadata(null, + new PropertyChangedCallback(OnFitViewModelChanged))); + + public FitViewModel FitViewModel + { + get + { + return (FitViewModel)GetValue(FitViewModelProperty); + } + set + { + SetValue(FitViewModelProperty, value); + } + } + + private static void OnFitViewModelChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + ZoomBox target = (ZoomBox)d; + var fitviewmodel = e.NewValue as FitViewModel; + if (fitviewmodel != null) + { + target.OnFitViewModelChanged(fitviewmodel); + } + } + + private void OnFitViewModelChanged(FitViewModel fitViewModel) + { + if (IsLoaded && fitViewModel != null) + { + if (fitViewModel.FitMode == FitMode.None) + { + + } + else if (fitViewModel.FitMode == FitMode.FitWidth) + { + ZoomValue = (this.ScrollViewer.ViewportWidth * fitViewModel.PaddingRate) / fitViewModel.BoundingRect.Width; + } + else if (fitViewModel.FitMode == FitMode.FitHeight) + { + ZoomValue = (this.ScrollViewer.ViewportHeight * fitViewModel.PaddingRate) / fitViewModel.BoundingRect.Height; + } + else if (fitViewModel.FitMode == FitMode.FitAuto) + { + ZoomValue = Math.Min( + (this.ScrollViewer.ViewportWidth * fitViewModel.PaddingRate) / fitViewModel.BoundingRect.Width, + (this.ScrollViewer.ViewportHeight * fitViewModel.PaddingRate) / fitViewModel.BoundingRect.Height + ); + } + + double xOffset, yOffset; + xOffset = fitViewModel.BoundingRect.Left * ZoomValue - (this.ScrollViewer.ViewportWidth - fitViewModel.BoundingRect.Width * ZoomValue) / 2; + yOffset = fitViewModel.BoundingRect.Top * ZoomValue - (this.ScrollViewer.ViewportHeight - fitViewModel.BoundingRect.Height * ZoomValue) / 2; + this.ScrollViewer.ScrollToHorizontalOffset(xOffset); + this.ScrollViewer.ScrollToVerticalOffset(yOffset); + } + } #endregion + public ZoomBox() + { + this.Loaded += ZoomBox_Loaded; + } + + private void ZoomBox_Loaded(object sender, RoutedEventArgs e) + { + OnFitViewModelChanged(FitViewModel); + } + public override void OnApplyTemplate() { base.OnApplyTemplate(); @@ -163,6 +230,8 @@ namespace AIStudio.Wpf.DiagramDesigner this.zoomThumb.DragDelta += new DragDeltaEventHandler(this.Thumb_DragDelta); this.zoomSlider.ValueChanged += new RoutedPropertyChangedEventHandler(this.ZoomSlider_ValueChanged); + + } private void ZoomSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) @@ -197,7 +266,7 @@ namespace AIStudio.Wpf.DiagramDesigner Canvas.SetTop(this.zoomThumb, yOffset + this.ScrollViewer.VerticalOffset * scale); } catch { } - } + } /// /// 用于记录鼠标按下的点 @@ -207,7 +276,6 @@ namespace AIStudio.Wpf.DiagramDesigner private void DesignerCanvas_MouseRightButtonDown(object sender, MouseButtonEventArgs e) { _clickPoint = e.GetPosition((FrameworkElement)sender); - Debug.WriteLine($"({_clickPoint.X},{_clickPoint.Y})"); DesignerCanvas.Cursor = Cursors.Hand; } @@ -221,7 +289,6 @@ namespace AIStudio.Wpf.DiagramDesigner if (e.RightButton == MouseButtonState.Pressed) { FrameworkElement cabSender = (FrameworkElement)sender; - //_clickPoint=new Point(scroll.ActualWidth/2,scroll.ActualHeight/2); double x; double y; Point p = e.MouseDevice.GetPosition(cabSender); @@ -265,8 +332,34 @@ namespace AIStudio.Wpf.DiagramDesigner xOffset = (x - scale * w) / 2; yOffset = (y - scale * h) / 2; } - + } } + + public class FitViewModel + { + public Rect BoundingRect + { + get;set; + } + + public FitMode FitMode + { + get;set; + } + + public double PaddingRate + { + get; set; + } = 0.9; + } + + public enum FitMode + { + None, + FitAuto, + FitWidth, + FitHeight, + } } diff --git a/AIStudio.Wpf.DiagramDesigner/Geometrys/RectangleBase.cs b/AIStudio.Wpf.DiagramDesigner/Geometrys/RectangleBase.cs index 85a187b..d567bf0 100644 --- a/AIStudio.Wpf.DiagramDesigner/Geometrys/RectangleBase.cs +++ b/AIStudio.Wpf.DiagramDesigner/Geometrys/RectangleBase.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Windows; namespace AIStudio.Wpf.DiagramDesigner.Geometrys { @@ -1069,6 +1070,16 @@ namespace AIStudio.Wpf.DiagramDesigner.Geometrys // return value; //} + public static implicit operator RectangleBase(Rect rect) + { + return new RectangleBase(rect.Left, rect.Top, rect.Width, rect.Height); + } + + public static implicit operator Rect(RectangleBase rect) + { + return new Rect(rect.Left, rect.Top, rect.Width, rect.Height); + } + #endregion Public Methods } diff --git a/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml b/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml index b492a67..b81c9b7 100644 --- a/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml +++ b/AIStudio.Wpf.DiagramDesigner/UserControls/DiagramControl.xaml @@ -856,7 +856,7 @@ AllowDrop="{Binding AllowDrop}"> - + @@ -887,7 +887,7 @@ GridMarginSize="{Binding GridMarginSize}" GridColor="{Binding GridColor}" Background="{Binding PageBackground,Converter={StaticResource ColorBrushConverter}}" - AllowDrop="{Binding AllowDrop}"> + AllowDrop="{Binding AllowDrop}"> @@ -905,8 +905,8 @@ MaximumZoomValue="{Binding MaximumZoomValue,Mode=TwoWay}" MinimumZoomValue="{Binding MinimumZoomValue,Mode=TwoWay}" ZoomValue="{Binding ZoomValue,Mode=TwoWay}" - Margin="5,0,0,5" /> - + FitViewModel="{Binding FitViewModel}" + Margin="5,0,0,5" /> diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs index d788366..086e942 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs @@ -408,7 +408,7 @@ namespace AIStudio.Wpf.DiagramDesigner } } - private double _maximumZoomValue = 3; + private double _maximumZoomValue = 100; [Browsable(false)] public double MaximumZoomValue { @@ -422,7 +422,7 @@ namespace AIStudio.Wpf.DiagramDesigner } } - private double _minimumZoomValue = 0.5; + private double _minimumZoomValue = 0.01; [Browsable(false)] public double MinimumZoomValue { @@ -463,6 +463,19 @@ namespace AIStudio.Wpf.DiagramDesigner } } + private FitViewModel _fitViewModel; + public FitViewModel FitViewModel + { + get + { + return _fitViewModel; + } + set + { + SetProperty(ref _fitViewModel, value); + } + } + private string _name; [Browsable(false)] public string Name @@ -561,6 +574,26 @@ namespace AIStudio.Wpf.DiagramDesigner } } + protected ObservableCollection menuOptions; + public IEnumerable MenuOptions + { + get + { + return menuOptions; + } + } + + public bool ShowMenuOptions + { + get + { + if (MenuOptions == null || MenuOptions.Count() == 0) + return false; + else + return true; + } + } + public DiagramOption DiagramOption { get; set; @@ -739,7 +772,7 @@ namespace AIStudio.Wpf.DiagramDesigner } private SimpleCommand _selectAllCommand; - public virtual SimpleCommand SelectAllCommand + public SimpleCommand SelectAllCommand { get { @@ -748,7 +781,7 @@ namespace AIStudio.Wpf.DiagramDesigner } private SimpleCommand _selectInverseCommand; - public virtual SimpleCommand SelectInverseCommand + public SimpleCommand SelectInverseCommand { get { @@ -882,6 +915,33 @@ namespace AIStudio.Wpf.DiagramDesigner } } + private SimpleCommand _fitAutoCommand; + public SimpleCommand FitAutoCommand + { + get + { + return this._fitAutoCommand ?? (this._fitAutoCommand = new SimpleCommand(ExecuteEnable, ExecuteFitAutoCommand)); + } + } + + private SimpleCommand _fitWidthCommand; + public SimpleCommand FitWidthCommand + { + get + { + return this._fitWidthCommand ?? (this._fitWidthCommand = new SimpleCommand(ExecuteEnable, ExecuteFitWidthCommand)); + } + } + + private SimpleCommand _fitHeightCommand; + public SimpleCommand FitHeightCommand + { + get + { + return this._fitHeightCommand ?? (this._fitHeightCommand = new SimpleCommand(ExecuteEnable, ExecuteFitHeightCommand)); + } + } + private SimpleCommand _groupCommand; public SimpleCommand GroupCommand { @@ -991,6 +1051,7 @@ namespace AIStudio.Wpf.DiagramDesigner AllowDrop = diagramItem.AllowDrop; Init(); + BuildMenuOptions(); } public virtual void Init() @@ -1003,6 +1064,18 @@ namespace AIStudio.Wpf.DiagramDesigner return IsReadOnly == false; } + #region 菜单 + private void BuildMenuOptions() + { + menuOptions = new ObservableCollection(); + CinchMenuItem menuItem = new CinchMenuItem(); + menuItem.Text = "居中"; + menuItem.Command = CenterMoveCommand; + menuItem.CommandParameter = this; + menuOptions.Add(menuItem); + } + #endregion + #region UnDo ReDo private void Do(object sender, string propertyName, object newvalue) @@ -2250,7 +2323,7 @@ namespace AIStudio.Wpf.DiagramDesigner } } - private void ExecuteCenterMoveCommand(object parameter) + protected virtual void ExecuteCenterMoveCommand(object parameter) { IEnumerable selectedItems; if (parameter is IEnumerable para) @@ -2267,6 +2340,8 @@ namespace AIStudio.Wpf.DiagramDesigner item.Left = (PageSize.Width - item.ItemWidth) / 2; item.Top = (PageSize.Height - item.ItemHeight) / 2; } + + FitViewModel = new FitViewModel() { BoundingRect = DiagramViewModelHelper.GetBoundingRectangle(selectedItems) }; } public void UpdateZIndex() @@ -2329,6 +2404,23 @@ namespace AIStudio.Wpf.DiagramDesigner #endregion + #region 适应大小 + private void ExecuteFitAutoCommand(object parameter) + { + FitViewModel = new FitViewModel() { BoundingRect = DiagramViewModelHelper.GetBoundingRectangle(Items.OfType()), FitMode = FitMode.FitAuto }; + } + + private void ExecuteFitWidthCommand(object parameter) + { + FitViewModel = new FitViewModel() { BoundingRect = DiagramViewModelHelper.GetBoundingRectangle(Items.OfType()), FitMode = FitMode.FitWidth }; + } + + private void ExecuteFitHeightCommand(object parameter) + { + FitViewModel = new FitViewModel() { BoundingRect = DiagramViewModelHelper.GetBoundingRectangle(Items.OfType()), FitMode = FitMode.FitHeight }; + } + #endregion + #region 分组 private void ExecuteGroupCommand(object parameter) { diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/DefaultDesignerItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/DefaultDesignerItemViewModel.cs similarity index 100% rename from AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/DefaultDesignerItemViewModel.cs rename to AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/DefaultDesignerItemViewModel.cs diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/GifImageItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/GifImageItemViewModel.cs similarity index 100% rename from AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/GifImageItemViewModel.cs rename to AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/GifImageItemViewModel.cs diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/ImageItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/ImageItemViewModel.cs similarity index 100% rename from AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/ImageItemViewModel.cs rename to AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/ImageItemViewModel.cs diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/LinkPointDesignerItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/LinkPointDesignerItemViewModel.cs similarity index 100% rename from AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/LinkPointDesignerItemViewModel.cs rename to AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/LinkPointDesignerItemViewModel.cs diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/LogicalGateItemViewModelBase.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/LogicalGateItemViewModelBase.cs similarity index 100% rename from AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/LogicalGateItemViewModelBase.cs rename to AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/LogicalGateItemViewModelBase.cs diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/MediaItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/MediaItemViewModel.cs similarity index 100% rename from AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/MediaItemViewModel.cs rename to AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/MediaItemViewModel.cs diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/PointDesignerItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/PointDesignerItemViewModel.cs similarity index 100% rename from AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/PointDesignerItemViewModel.cs rename to AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/PointDesignerItemViewModel.cs diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/ShapeDesignerItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/ShapeDesignerItemViewModel.cs similarity index 100% rename from AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/ShapeDesignerItemViewModel.cs rename to AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/ShapeDesignerItemViewModel.cs diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/TextDesignerItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/TextDesignerItemViewModel.cs similarity index 100% rename from AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/TextDesignerItemViewModel.cs rename to AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/TextDesignerItemViewModel.cs diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/VideoItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/VideoItemViewModel.cs similarity index 100% rename from AIStudio.Wpf.DiagramDesigner/ViewModels/SimpleViewModel/VideoItemViewModel.cs rename to AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/VideoItemViewModel.cs diff --git a/AIStudio.Wpf.Mind/Controls/MindEditor.xaml b/AIStudio.Wpf.Mind/Controls/MindEditor.xaml index 44ea227..bbb67d5 100644 --- a/AIStudio.Wpf.Mind/Controls/MindEditor.xaml +++ b/AIStudio.Wpf.Mind/Controls/MindEditor.xaml @@ -20,7 +20,7 @@ - + diff --git a/AIStudio.Wpf.Mind/Controls/ToolBoxControl.xaml b/AIStudio.Wpf.Mind/Controls/ToolBoxControl.xaml index 00ec2dd..30eeab5 100644 --- a/AIStudio.Wpf.Mind/Controls/ToolBoxControl.xaml +++ b/AIStudio.Wpf.Mind/Controls/ToolBoxControl.xaml @@ -514,7 +514,7 @@ - + 展开 @@ -543,7 +543,40 @@ - + + + + + + +