适应窗口大小完成

This commit is contained in:
艾竹
2023-03-12 22:47:45 +08:00
parent e2753b0bff
commit f22d6dd3f1
18 changed files with 280 additions and 42 deletions

View File

@@ -198,6 +198,7 @@ namespace AIStudio.Wpf.DiagramDesigner
private void DesignerCanvas_Loaded(object sender, RoutedEventArgs e)
{
this.Focus();
}
protected override void OnRender(DrawingContext dc)

View File

@@ -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<double>(this.ZoomSlider_ValueChanged);
}
private void ZoomSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
@@ -197,7 +266,7 @@ namespace AIStudio.Wpf.DiagramDesigner
Canvas.SetTop(this.zoomThumb, yOffset + this.ScrollViewer.VerticalOffset * scale);
}
catch { }
}
}
/// <summary>
/// 用于记录鼠标按下的点
@@ -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,
}
}

View File

@@ -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
}

View File

@@ -856,7 +856,7 @@
AllowDrop="{Binding AllowDrop}">
<dd:DesignerCanvas.LayoutTransform>
<ScaleTransform ScaleX="{Binding ZoomValue}" ScaleY="{Binding ZoomValue}" />
</dd:DesignerCanvas.LayoutTransform>
</dd:DesignerCanvas.LayoutTransform>
</dd:DesignerCanvas>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
@@ -887,7 +887,7 @@
GridMarginSize="{Binding GridMarginSize}"
GridColor="{Binding GridColor}"
Background="{Binding PageBackground,Converter={StaticResource ColorBrushConverter}}"
AllowDrop="{Binding AllowDrop}">
AllowDrop="{Binding AllowDrop}">
<dd:DesignerCanvas.LayoutTransform>
<ScaleTransform ScaleX="{Binding ZoomValue}" ScaleY="{Binding ZoomValue}" />
</dd:DesignerCanvas.LayoutTransform>
@@ -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" />
</Grid>
</ControlTemplate>
</Setter.Value>

View File

@@ -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<CinchMenuItem> menuOptions;
public IEnumerable<CinchMenuItem> 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>();
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<DesignerItemViewModelBase> selectedItems;
if (parameter is IEnumerable<DesignerItemViewModelBase> 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<DesignerItemViewModelBase>()), FitMode = FitMode.FitAuto };
}
private void ExecuteFitWidthCommand(object parameter)
{
FitViewModel = new FitViewModel() { BoundingRect = DiagramViewModelHelper.GetBoundingRectangle(Items.OfType<DesignerItemViewModelBase>()), FitMode = FitMode.FitWidth };
}
private void ExecuteFitHeightCommand(object parameter)
{
FitViewModel = new FitViewModel() { BoundingRect = DiagramViewModelHelper.GetBoundingRectangle(Items.OfType<DesignerItemViewModelBase>()), FitMode = FitMode.FitHeight };
}
#endregion
#region
private void ExecuteGroupCommand(object parameter)
{