mirror of
https://gitee.com/akwkevin/aistudio.-wpf.-diagram
synced 2026-03-17 23:16:41 +08:00
适应窗口大小完成
This commit is contained in:
@@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user