ZoomBox 完成

This commit is contained in:
艾竹
2023-02-14 22:15:19 +08:00
parent 38cb0fae85
commit 3ef7434f5b
6 changed files with 88 additions and 22 deletions

View File

@@ -1900,7 +1900,9 @@
Width="180" Width="180"
HorizontalAlignment="Right" HorizontalAlignment="Right"
VerticalAlignment="Bottom" VerticalAlignment="Bottom"
ScrollViewer="{Binding ElementName=designerScrollViewer}" DesignerCanvas="{Binding ElementName=diagram}"
MaximumZoomValue="{Binding MaximumZoomValue,Mode=TwoWay}"
MinimumZoomValue="{Binding MinimumZoomValue,Mode=TwoWay}"
ZoomValue="{Binding ZoomValue,Mode=TwoWay}" ZoomValue="{Binding ZoomValue,Mode=TwoWay}"
Margin="0,0,5,5" /> Margin="0,0,5,5" />
</Grid> </Grid>
@@ -2062,9 +2064,9 @@
<Fluent:StatusBarItem Title="Zoom Slider" <Fluent:StatusBarItem Title="Zoom Slider"
HorizontalAlignment="Right"> HorizontalAlignment="Right">
<Slider x:Name="zoomSlider" <Slider x:Name="zoomSlider"
Minimum="0.5" Minimum="{Binding PageViewModel.DiagramViewModel.MinimumZoomValue}"
Value="{Binding PageViewModel.DiagramViewModel.ZoomValue}" Value="{Binding PageViewModel.DiagramViewModel.ZoomValue}"
Maximum="2.0" Maximum="{Binding PageViewModel.DiagramViewModel.MaximumZoomValue}"
IsDirectionReversed="False" IsDirectionReversed="False"
Style="{DynamicResource ZoomSliderStyle}" Style="{DynamicResource ZoomSliderStyle}"
IsSnapToTickEnabled="True" IsSnapToTickEnabled="True"

View File

@@ -13,7 +13,6 @@ namespace AIStudio.Wpf.DiagramDesigner
private Thumb zoomThumb; private Thumb zoomThumb;
private Canvas zoomCanvas; private Canvas zoomCanvas;
private Slider zoomSlider; private Slider zoomSlider;
private DiagramControl diagramControl;
#region DPs #region DPs
@@ -34,20 +33,20 @@ namespace AIStudio.Wpf.DiagramDesigner
DependencyProperty.Register(nameof(ScrollViewer), typeof(ScrollViewer), typeof(ZoomBox)); DependencyProperty.Register(nameof(ScrollViewer), typeof(ScrollViewer), typeof(ZoomBox));
#endregion #endregion
#region DesignerCanvas #region FrameworkElement
public static readonly DependencyProperty DesignerCanvasProperty = public static readonly DependencyProperty DesignerCanvasProperty =
DependencyProperty.Register(nameof(DesignerCanvas), typeof(DesignerCanvas), typeof(ZoomBox), DependencyProperty.Register(nameof(DesignerCanvas), typeof(FrameworkElement), typeof(ZoomBox),
new FrameworkPropertyMetadata(null, new FrameworkPropertyMetadata(null,
new PropertyChangedCallback(OnDesignerCanvasChanged))); new PropertyChangedCallback(OnDesignerCanvasChanged)));
public DesignerCanvas DesignerCanvas public FrameworkElement DesignerCanvas
{ {
get get
{ {
return (DesignerCanvas)GetValue(DesignerCanvasProperty); return (FrameworkElement)GetValue(DesignerCanvasProperty);
} }
set set
{ {
@@ -55,17 +54,16 @@ namespace AIStudio.Wpf.DiagramDesigner
} }
} }
private static void OnDesignerCanvasChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) private static void OnDesignerCanvasChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{ {
ZoomBox target = (ZoomBox)d; ZoomBox target = (ZoomBox)d;
DesignerCanvas oldDesignerCanvas = (DesignerCanvas)e.OldValue; FrameworkElement oldDesignerCanvas = (FrameworkElement)e.OldValue;
DesignerCanvas newDesignerCanvas = (DesignerCanvas)e.NewValue; FrameworkElement newDesignerCanvas = (FrameworkElement)e.NewValue;
target.OnDesignerCanvasChanged(oldDesignerCanvas, newDesignerCanvas); target.OnDesignerCanvasChanged(oldDesignerCanvas, newDesignerCanvas);
} }
protected virtual void OnDesignerCanvasChanged(DesignerCanvas oldDesignerCanvas, DesignerCanvas newDesignerCanvas) protected virtual void OnDesignerCanvasChanged(FrameworkElement oldDesignerCanvas, FrameworkElement newDesignerCanvas)
{ {
if (oldDesignerCanvas != null) if (oldDesignerCanvas != null)
{ {
@@ -96,19 +94,43 @@ namespace AIStudio.Wpf.DiagramDesigner
} }
} }
public static readonly DependencyProperty MaximumZoomValueProperty =
DependencyProperty.Register(nameof(MaximumZoomValue), typeof(double), typeof(ZoomBox), new UIPropertyMetadata(3d));
public double MaximumZoomValue
{
get
{
return (double)GetValue(MaximumZoomValueProperty);
}
set
{
SetValue(MaximumZoomValueProperty, value);
}
}
public static readonly DependencyProperty MinimumZoomValueProperty =
DependencyProperty.Register(nameof(MinimumZoomValue), typeof(double), typeof(ZoomBox), new UIPropertyMetadata(0.5d));
public double MinimumZoomValue
{
get
{
return (double)GetValue(MinimumZoomValueProperty);
}
set
{
SetValue(MinimumZoomValueProperty, value);
}
}
#endregion #endregion
public override void OnApplyTemplate() public override void OnApplyTemplate()
{ {
base.OnApplyTemplate(); base.OnApplyTemplate();
this.ScrollViewer = VisualHelper.TryFindParent<ScrollViewer>(this.DesignerCanvas);
if (this.ScrollViewer == null) if (this.ScrollViewer == null)
return; return;
DesignerCanvas = VisualHelper.FindChild<DesignerCanvas>(this.ScrollViewer);
diagramControl = VisualHelper.FindChild<DiagramControl>(this.ScrollViewer);
this.zoomThumb = Template.FindName("PART_ZoomThumb", this) as Thumb; this.zoomThumb = Template.FindName("PART_ZoomThumb", this) as Thumb;
if (this.zoomThumb == null) if (this.zoomThumb == null)
throw new Exception("PART_ZoomThumb template is missing!"); throw new Exception("PART_ZoomThumb template is missing!");
@@ -162,6 +184,12 @@ namespace AIStudio.Wpf.DiagramDesigner
private void DesignerCanvas_MouseWheel(object sender, EventArgs e) private void DesignerCanvas_MouseWheel(object sender, EventArgs e)
{ {
if (Keyboard.IsKeyDown(Key.LeftCtrl) == false
&& Keyboard.IsKeyDown(Key.RightCtrl) == false)
{
return;
}
MouseWheelEventArgs wheel = (MouseWheelEventArgs)e; MouseWheelEventArgs wheel = (MouseWheelEventArgs)e;
//divide the value by 10 so that it is more smooth //divide the value by 10 so that it is more smooth
@@ -172,9 +200,9 @@ namespace AIStudio.Wpf.DiagramDesigner
private void InvalidateScale(out double scale, out double xOffset, out double yOffset) private void InvalidateScale(out double scale, out double xOffset, out double yOffset)
{ {
Vector vector = System.Windows.Media.VisualTreeHelper.GetOffset(diagramControl); Vector vector = System.Windows.Media.VisualTreeHelper.GetOffset(DesignerCanvas);
double w = DesignerCanvas.ActualWidth * ZoomValue + vector.X * 2; double w = DesignerCanvas.ActualWidth + vector.X * 2;
double h = DesignerCanvas.ActualHeight * ZoomValue + vector.Y * 2; double h = DesignerCanvas.ActualHeight + vector.Y * 2;
// zoom canvas size // zoom canvas size
double x = this.zoomCanvas.ActualWidth; double x = this.zoomCanvas.ActualWidth;

View File

@@ -210,8 +210,8 @@
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Slider Name="PART_ZoomSlider" <Slider Name="PART_ZoomSlider"
Ticks="0.25,0.50,0.75,1,1.25,1.50,2.00,3.00,4.00,5.00" Ticks="0.25,0.50,0.75,1,1.25,1.50,2.00,3.00,4.00,5.00"
Minimum="0.25" Minimum="{Binding MinimumZoomValue,RelativeSource={RelativeSource Mode=TemplatedParent},Mode=TwoWay}"
Maximum="5" Maximum="{Binding MaximumZoomValue,RelativeSource={RelativeSource Mode=TemplatedParent},Mode=TwoWay}"
SmallChange="0.25" SmallChange="0.25"
LargeChange="0.25" LargeChange="0.25"
Value="{Binding ZoomValue,RelativeSource={RelativeSource Mode=TemplatedParent},Mode=TwoWay}" Value="{Binding ZoomValue,RelativeSource={RelativeSource Mode=TemplatedParent},Mode=TwoWay}"

View File

@@ -102,7 +102,7 @@ namespace AIStudio.Wpf.DiagramDesigner
var newZoomValue = DiagramViewModel.ZoomValue + (e.Delta > 0 ? 0.1 : -0.1); var newZoomValue = DiagramViewModel.ZoomValue + (e.Delta > 0 ? 0.1 : -0.1);
DiagramViewModel.ZoomValue = Math.Max(Math.Min(newZoomValue, 10), 0.5); DiagramViewModel.ZoomValue = Math.Max(Math.Min(newZoomValue, DiagramViewModel.MaximumZoomValue), DiagramViewModel.MinimumZoomValue);
e.Handled = true; e.Handled = true;
} }

View File

@@ -400,6 +400,34 @@ namespace AIStudio.Wpf.DiagramDesigner
} }
} }
private double _maximumZoomValue = 3;
[Browsable(false)]
public double MaximumZoomValue
{
get
{
return _maximumZoomValue;
}
set
{
SetProperty(ref _maximumZoomValue, value);
}
}
private double _minimumZoomValue = 0.5;
[Browsable(false)]
public double MinimumZoomValue
{
get
{
return _minimumZoomValue;
}
set
{
SetProperty(ref _minimumZoomValue, value);
}
}
private double _delayZoomValue = 1; private double _delayZoomValue = 1;
[Browsable(false)] [Browsable(false)]
public double DelayZoomValue public double DelayZoomValue

View File

@@ -257,6 +257,14 @@ namespace AIStudio.Wpf.DiagramDesigner
{ {
get; set; get; set;
} }
double MaximumZoomValue
{
get; set;
}
double MinimumZoomValue
{
get; set;
}
bool AllowDrop bool AllowDrop
{ {
get; set; get; set;