mirror of
https://gitee.com/akwkevin/aistudio.-wpf.-diagram
synced 2026-04-04 08:06:36 +08:00
适应窗口大小完成
This commit is contained in:
@@ -198,6 +198,7 @@ namespace AIStudio.Wpf.DiagramDesigner
|
||||
private void DesignerCanvas_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
this.Focus();
|
||||
|
||||
}
|
||||
|
||||
protected override void OnRender(DrawingContext dc)
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user