适应窗口大小完成

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

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