ZoomBox待完成,还需要调整

This commit is contained in:
艾竹
2023-02-13 22:50:50 +08:00
parent 4d36eac218
commit dfe76438c2
9 changed files with 132 additions and 68 deletions

View File

@@ -33,7 +33,7 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels
DiagramViewModels = new ObservableCollection<IDiagramViewModel>()
{
new DiagramViewModel(){Name= "页-1", DiagramType = diagramType},
new DiagramViewModel(){Name= "页-1", DiagramType = diagramType, ZoomValue = 0.8},
};
DiagramViewModel = DiagramViewModels.FirstOrDefault();

View File

@@ -1843,58 +1843,67 @@
</TabControl.ItemContainerStyle>
<TabControl.ContentTemplate>
<DataTemplate>
<ScrollViewer x:Name="designerScrollViewer"
<Grid>
<ScrollViewer x:Name="designerScrollViewer"
Background="{DynamicResource GrayBrush8}"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto">
<DockPanel x:Name="panel">
<controls:Ruler x:Name="hruler"
<DockPanel x:Name="panel">
<controls:Ruler x:Name="hruler"
Unit="{Binding PageUnit,Converter={StaticResource RulerUnitConverter}}"
DockPanel.Dock="Top"
Margin="21,0,0,0"
Zoom="{Binding ZoomValue}"
AutoSize="True"
ClipToBounds="True" >
<controls:Ruler.CountShift>
<MultiBinding Converter="{StaticResource CountShiftConverter}" ConverterParameter="X">
<Binding ElementName="diagram" Path="." />
<Binding ElementName="diagram" Path="ZoomValue"/>
<Binding Path="PageUnit"/>
<Binding ElementName="designerScrollViewer" Path="ActualWidth"/>
<Binding ElementName="panel" Path="ActualWidth"/>
<Binding ElementName="diagram" Path="ActualWidth"/>
</MultiBinding>
</controls:Ruler.CountShift>
</controls:Ruler>
<controls:Ruler x:Name="vruler"
<controls:Ruler.CountShift>
<MultiBinding Converter="{StaticResource CountShiftConverter}" ConverterParameter="X">
<Binding ElementName="diagram" Path="." />
<Binding Path="DelayZoomValue"/>
<Binding Path="PageUnit"/>
<Binding ElementName="designerScrollViewer" Path="ActualWidth"/>
<Binding ElementName="panel" Path="ActualWidth"/>
<Binding ElementName="diagram" Path="ActualWidth"/>
</MultiBinding>
</controls:Ruler.CountShift>
</controls:Ruler>
<controls:Ruler x:Name="vruler"
Unit="{Binding PageUnit,Converter={StaticResource RulerUnitConverter}}"
Marks="Up"
RenderTransformOrigin="0,0"
AutoSize="True"
Zoom="{Binding ZoomValue}"
ClipToBounds="True">
<controls:Ruler.LayoutTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="90" />
<TranslateTransform X="23" />
</TransformGroup>
</controls:Ruler.LayoutTransform>
<controls:Ruler.CountShift>
<MultiBinding Converter="{StaticResource CountShiftConverter}" ConverterParameter="Y">
<Binding ElementName="diagram" Path="." />
<Binding ElementName="diagram" Path="ZoomValue" />
<Binding Path="PageUnit"/>
<Binding ElementName="designerScrollViewer" Path="ActualHeight"/>
<Binding ElementName="panel" Path="ActualHeight"/>
<Binding ElementName="diagram" Path="ActualHeight"/>
</MultiBinding>
</controls:Ruler.CountShift>
</controls:Ruler>
<dd:DiagramControl x:Name="diagram" DataContext="{Binding .}" Margin="50"/>
</DockPanel>
</ScrollViewer>
<controls:Ruler.LayoutTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1" />
<SkewTransform AngleX="0" AngleY="0" />
<RotateTransform Angle="90" />
<TranslateTransform X="23" />
</TransformGroup>
</controls:Ruler.LayoutTransform>
<controls:Ruler.CountShift>
<MultiBinding Converter="{StaticResource CountShiftConverter}" ConverterParameter="Y">
<Binding ElementName="diagram" Path="." />
<Binding Path="DelayZoomValue"/>
<Binding Path="PageUnit"/>
<Binding ElementName="designerScrollViewer" Path="ActualHeight"/>
<Binding ElementName="panel" Path="ActualHeight"/>
<Binding ElementName="diagram" Path="ActualHeight"/>
</MultiBinding>
</controls:Ruler.CountShift>
</controls:Ruler>
<dd:DiagramControl x:Name="diagram" DataContext="{Binding .}" Margin="50"/>
</DockPanel>
</ScrollViewer>
<!--<dd:ZoomBox x:Name="zoomBox"
Width="180"
HorizontalAlignment="Right"
VerticalAlignment="Bottom"
ScrollViewer="{Binding ElementName=designerScrollViewer}"
ZoomValue="{Binding ZoomValue,Mode=TwoWay}"
Margin="0,0,5,5" />-->
</Grid>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>

View File

@@ -13,7 +13,7 @@ namespace AIStudio.Wpf.DiagramDesigner.Additionals.Converters
{
if (values != null && values.Length > 2)
{
var diagram = values[0] as AIStudio.Wpf.DiagramDesigner.DiagramControl;
var diagram = values[0] as FrameworkElement;
var zoomValue = (double)values[1];
var pageunit = (PageUnit)values[2];
var unit = Unit.Cm;

View File

@@ -4,6 +4,7 @@ using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Media;
using System.Windows.Input;
using AIStudio.Wpf.DiagramDesigner.Helpers;
namespace AIStudio.Wpf.DiagramDesigner
{
@@ -12,7 +13,6 @@ namespace AIStudio.Wpf.DiagramDesigner
private Thumb zoomThumb;
private Canvas zoomCanvas;
private Slider zoomSlider;
private ScaleTransform scaleTransform;
#region DPs
@@ -24,7 +24,24 @@ namespace AIStudio.Wpf.DiagramDesigner
}
public static readonly DependencyProperty ScrollViewerProperty =
DependencyProperty.Register(nameof(ScrollViewer), typeof(ScrollViewer), typeof(ZoomBox));
DependencyProperty.Register(nameof(ScrollViewer), typeof(ScrollViewer), typeof(ZoomBox), new FrameworkPropertyMetadata(null,
new PropertyChangedCallback(OnScrollViewerChanged)));
private static void OnScrollViewerChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ZoomBox target = (ZoomBox)d;
ScrollViewer oldvalue = (ScrollViewer)e.OldValue;
ScrollViewer newvalue = (ScrollViewer)e.NewValue;
target.OnScrollViewerChanged(oldvalue, newvalue);
}
protected virtual void OnScrollViewerChanged(ScrollViewer oldvalue, ScrollViewer newvalue)
{
if (newvalue != null)
{
DesignerCanvas = VisualHelper.FindChild<DesignerCanvas>(newvalue);
}
}
#endregion
#region DesignerCanvas
@@ -56,20 +73,33 @@ namespace AIStudio.Wpf.DiagramDesigner
{
if (oldDesignerCanvas != null)
{
newDesignerCanvas.LayoutUpdated -= new EventHandler(this.DesignerCanvas_LayoutUpdated);
newDesignerCanvas.MouseWheel -= new MouseWheelEventHandler(this.DesignerCanvas_MouseWheel);
oldDesignerCanvas.LayoutUpdated -= new EventHandler(this.DesignerCanvas_LayoutUpdated);
oldDesignerCanvas.MouseWheel -= new MouseWheelEventHandler(this.DesignerCanvas_MouseWheel);
}
if (newDesignerCanvas != null)
{
newDesignerCanvas.LayoutUpdated += new EventHandler(this.DesignerCanvas_LayoutUpdated);
newDesignerCanvas.MouseWheel += new MouseWheelEventHandler(this.DesignerCanvas_MouseWheel);
newDesignerCanvas.LayoutTransform = this.scaleTransform;
}
}
#endregion
public static readonly DependencyProperty ZoomValueProperty =
DependencyProperty.Register(nameof(ZoomValue), typeof(double), typeof(ZoomBox), new UIPropertyMetadata(1d));
public double ZoomValue
{
get
{
return (double)GetValue(ZoomValueProperty);
}
set
{
SetValue(ZoomValueProperty, value);
}
}
#endregion
public override void OnApplyTemplate()
@@ -79,6 +109,8 @@ namespace AIStudio.Wpf.DiagramDesigner
if (this.ScrollViewer == null)
return;
DesignerCanvas = VisualHelper.FindChild<DesignerCanvas>(this.ScrollViewer);
this.zoomThumb = Template.FindName("PART_ZoomThumb", this) as Thumb;
if (this.zoomThumb == null)
throw new Exception("PART_ZoomThumb template is missing!");
@@ -93,7 +125,6 @@ namespace AIStudio.Wpf.DiagramDesigner
this.zoomThumb.DragDelta += new DragDeltaEventHandler(this.Thumb_DragDelta);
this.zoomSlider.ValueChanged += new RoutedPropertyChangedEventHandler<double>(this.ZoomSlider_ValueChanged);
this.scaleTransform = new ScaleTransform();
}
private void ZoomSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
@@ -103,8 +134,6 @@ namespace AIStudio.Wpf.DiagramDesigner
double newVerticalOffset = ((this.ScrollViewer.VerticalOffset + halfViewportHeight) * scale - halfViewportHeight);
double halfViewportWidth = this.ScrollViewer.ViewportWidth / 2;
double newHorizontalOffset = ((this.ScrollViewer.HorizontalOffset + halfViewportWidth) * scale - halfViewportWidth);
this.scaleTransform.ScaleX *= scale;
this.scaleTransform.ScaleY *= scale;
this.ScrollViewer.ScrollToHorizontalOffset(newHorizontalOffset);
this.ScrollViewer.ScrollToVerticalOffset(newVerticalOffset);
}
@@ -145,8 +174,8 @@ namespace AIStudio.Wpf.DiagramDesigner
private void InvalidateScale(out double scale, out double xOffset, out double yOffset)
{
double w = DesignerCanvas.ActualWidth * this.scaleTransform.ScaleX;
double h = DesignerCanvas.ActualHeight * this.scaleTransform.ScaleY;
double w = DesignerCanvas.ActualWidth * ZoomValue;
double h = DesignerCanvas.ActualHeight * ZoomValue;
// zoom canvas size
double x = this.zoomCanvas.ActualWidth;

View File

@@ -181,7 +181,7 @@
Name="PART_ZoomCanvas">
<Canvas.Background>
<VisualBrush Stretch="Uniform"
Visual="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ScrollViewer.Content}" />
Visual="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DesignerCanvas}" />
</Canvas.Background>
<Thumb Name="PART_ZoomThumb"
Cursor="SizeAll">
@@ -212,12 +212,12 @@
VerticalAlignment="Center"
HorizontalAlignment="Center"
Margin="0"
Ticks="25,50,75,100,125,150,200,300,400,500"
Minimum="25"
Maximum="500"
SmallChange="25"
LargeChange="25"
Value="100"
Ticks="0.25,0.50,0.75,1,1.25,1.50,2.00,3.00,4.00,5.00"
Minimum="0.25"
Maximum="5"
SmallChange="0.25"
LargeChange="0.25"
Value="{Binding ZoomValue,RelativeSource={RelativeSource Mode=TemplatedParent},Mode=TwoWay}"
MinWidth="104"
MinHeight="21"
IsSnapToTickEnabled="True"

View File

@@ -293,11 +293,7 @@
</ResourceDictionary>
</UserControl.Resources>
<UserControl.LayoutTransform>
<ScaleTransform x:Name="scale" ScaleX="{Binding ZoomValue}" ScaleY="{Binding ZoomValue}" Changed="ScaleTransform_Changed" />
</UserControl.LayoutTransform>
<Border BorderBrush="LightGray"
BorderThickness="0">
<Border>
<Grid>
<ItemsControl ItemsSource="{Binding Items}"
ItemContainerStyleSelector="{x:Static s:DesignerItemsControlItemStyleSelector.Instance}">
@@ -837,6 +833,9 @@
GridColor="{Binding GridColor}"
Background="{Binding PageBackground,Converter={StaticResource ColorBrushConverter}}"
AllowDrop="{Binding AllowDrop}">
<s:DesignerCanvas.LayoutTransform>
<ScaleTransform ScaleX="{Binding ZoomValue}" ScaleY="{Binding ZoomValue}" />
</s:DesignerCanvas.LayoutTransform>
</s:DesignerCanvas>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>

View File

@@ -69,19 +69,12 @@ namespace AIStudio.Wpf.DiagramDesigner
}
}
private void DesignerCanvas_Loaded(object sender, RoutedEventArgs e)
{
//DesignerCanvas myDesignerCanvas = sender as DesignerCanvas;
//zoomBox.DesignerCanvas = myDesignerCanvas;
}
private async void ScaleTransform_Changed(object sender, EventArgs e)
{
await System.Threading.Tasks.Task.Delay(100);
ZoomValue = scale.ScaleX;
}
private IDiagramViewModel DiagramViewModel
{
get

View File

@@ -400,6 +400,20 @@ namespace AIStudio.Wpf.DiagramDesigner
}
}
private double _delayZoomValue = 1;
[Browsable(false)]
public double DelayZoomValue
{
get
{
return _delayZoomValue;
}
set
{
SetProperty(ref _delayZoomValue, value);
}
}
private string _name;
[Browsable(false)]
public string Name
@@ -691,6 +705,8 @@ namespace AIStudio.Wpf.DiagramDesigner
public event DiagramEventHandler Event;
private IDisposable ZoomValueChangedSubscription;
public DiagramViewModel()
{
CreateNewDiagramCommand = new SimpleCommand(ExecuteEnable, ExecuteCreateNewDiagramCommand);
@@ -733,6 +749,14 @@ namespace AIStudio.Wpf.DiagramDesigner
Mediator.Instance.Register(this);
Items.CollectionChanged += Items_CollectionChanged;
ZoomValueChangedSubscription = WhenPropertyChanged.Where(o => o.ToString() == nameof(ZoomValue)).Throttle(TimeSpan.FromMilliseconds(100)).Subscribe(OnZoomValueChanged);//Sample
}
//提供给标尺计算延迟100ms等布局改变再计算。
private void OnZoomValueChanged(string obj)
{
DelayZoomValue = ZoomValue;
}
public DiagramViewModel(DiagramItem diagramItem) : this()

View File

@@ -45,6 +45,16 @@ namespace AIStudio.Wpf.Mind.ViewModels
SetProperty(ref _cornerRadius, value);
}
}
public double Spacing
{
get; set;
}
public List<MindNode> Children
{
get; set;
}
}
public class MindLevel1Node : MindNode