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>() DiagramViewModels = new ObservableCollection<IDiagramViewModel>()
{ {
new DiagramViewModel(){Name= "页-1", DiagramType = diagramType}, new DiagramViewModel(){Name= "页-1", DiagramType = diagramType, ZoomValue = 0.8},
}; };
DiagramViewModel = DiagramViewModels.FirstOrDefault(); DiagramViewModel = DiagramViewModels.FirstOrDefault();

View File

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

View File

@@ -13,7 +13,7 @@ namespace AIStudio.Wpf.DiagramDesigner.Additionals.Converters
{ {
if (values != null && values.Length > 2) 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 zoomValue = (double)values[1];
var pageunit = (PageUnit)values[2]; var pageunit = (PageUnit)values[2];
var unit = Unit.Cm; var unit = Unit.Cm;

View File

@@ -4,6 +4,7 @@ using System.Windows.Controls;
using System.Windows.Controls.Primitives; using System.Windows.Controls.Primitives;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Input; using System.Windows.Input;
using AIStudio.Wpf.DiagramDesigner.Helpers;
namespace AIStudio.Wpf.DiagramDesigner namespace AIStudio.Wpf.DiagramDesigner
{ {
@@ -12,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 ScaleTransform scaleTransform;
#region DPs #region DPs
@@ -24,7 +24,24 @@ namespace AIStudio.Wpf.DiagramDesigner
} }
public static readonly DependencyProperty ScrollViewerProperty = 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 #endregion
#region DesignerCanvas #region DesignerCanvas
@@ -56,20 +73,33 @@ namespace AIStudio.Wpf.DiagramDesigner
{ {
if (oldDesignerCanvas != null) if (oldDesignerCanvas != null)
{ {
newDesignerCanvas.LayoutUpdated -= new EventHandler(this.DesignerCanvas_LayoutUpdated); oldDesignerCanvas.LayoutUpdated -= new EventHandler(this.DesignerCanvas_LayoutUpdated);
newDesignerCanvas.MouseWheel -= new MouseWheelEventHandler(this.DesignerCanvas_MouseWheel); oldDesignerCanvas.MouseWheel -= new MouseWheelEventHandler(this.DesignerCanvas_MouseWheel);
} }
if (newDesignerCanvas != null) if (newDesignerCanvas != null)
{ {
newDesignerCanvas.LayoutUpdated += new EventHandler(this.DesignerCanvas_LayoutUpdated); newDesignerCanvas.LayoutUpdated += new EventHandler(this.DesignerCanvas_LayoutUpdated);
newDesignerCanvas.MouseWheel += new MouseWheelEventHandler(this.DesignerCanvas_MouseWheel); newDesignerCanvas.MouseWheel += new MouseWheelEventHandler(this.DesignerCanvas_MouseWheel);
newDesignerCanvas.LayoutTransform = this.scaleTransform;
} }
} }
#endregion #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 #endregion
public override void OnApplyTemplate() public override void OnApplyTemplate()
@@ -79,6 +109,8 @@ namespace AIStudio.Wpf.DiagramDesigner
if (this.ScrollViewer == null) if (this.ScrollViewer == null)
return; return;
DesignerCanvas = VisualHelper.FindChild<DesignerCanvas>(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!");
@@ -93,7 +125,6 @@ namespace AIStudio.Wpf.DiagramDesigner
this.zoomThumb.DragDelta += new DragDeltaEventHandler(this.Thumb_DragDelta); this.zoomThumb.DragDelta += new DragDeltaEventHandler(this.Thumb_DragDelta);
this.zoomSlider.ValueChanged += new RoutedPropertyChangedEventHandler<double>(this.ZoomSlider_ValueChanged); this.zoomSlider.ValueChanged += new RoutedPropertyChangedEventHandler<double>(this.ZoomSlider_ValueChanged);
this.scaleTransform = new ScaleTransform();
} }
private void ZoomSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) 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 newVerticalOffset = ((this.ScrollViewer.VerticalOffset + halfViewportHeight) * scale - halfViewportHeight);
double halfViewportWidth = this.ScrollViewer.ViewportWidth / 2; double halfViewportWidth = this.ScrollViewer.ViewportWidth / 2;
double newHorizontalOffset = ((this.ScrollViewer.HorizontalOffset + halfViewportWidth) * scale - halfViewportWidth); double newHorizontalOffset = ((this.ScrollViewer.HorizontalOffset + halfViewportWidth) * scale - halfViewportWidth);
this.scaleTransform.ScaleX *= scale;
this.scaleTransform.ScaleY *= scale;
this.ScrollViewer.ScrollToHorizontalOffset(newHorizontalOffset); this.ScrollViewer.ScrollToHorizontalOffset(newHorizontalOffset);
this.ScrollViewer.ScrollToVerticalOffset(newVerticalOffset); this.ScrollViewer.ScrollToVerticalOffset(newVerticalOffset);
} }
@@ -145,8 +174,8 @@ 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)
{ {
double w = DesignerCanvas.ActualWidth * this.scaleTransform.ScaleX; double w = DesignerCanvas.ActualWidth * ZoomValue;
double h = DesignerCanvas.ActualHeight * this.scaleTransform.ScaleY; double h = DesignerCanvas.ActualHeight * ZoomValue;
// zoom canvas size // zoom canvas size
double x = this.zoomCanvas.ActualWidth; double x = this.zoomCanvas.ActualWidth;

View File

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

View File

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

View File

@@ -69,19 +69,12 @@ namespace AIStudio.Wpf.DiagramDesigner
} }
} }
private void DesignerCanvas_Loaded(object sender, RoutedEventArgs e) private void DesignerCanvas_Loaded(object sender, RoutedEventArgs e)
{ {
//DesignerCanvas myDesignerCanvas = sender as DesignerCanvas; //DesignerCanvas myDesignerCanvas = sender as DesignerCanvas;
//zoomBox.DesignerCanvas = myDesignerCanvas; //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 private IDiagramViewModel DiagramViewModel
{ {
get 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; private string _name;
[Browsable(false)] [Browsable(false)]
public string Name public string Name
@@ -691,6 +705,8 @@ namespace AIStudio.Wpf.DiagramDesigner
public event DiagramEventHandler Event; public event DiagramEventHandler Event;
private IDisposable ZoomValueChangedSubscription;
public DiagramViewModel() public DiagramViewModel()
{ {
CreateNewDiagramCommand = new SimpleCommand(ExecuteEnable, ExecuteCreateNewDiagramCommand); CreateNewDiagramCommand = new SimpleCommand(ExecuteEnable, ExecuteCreateNewDiagramCommand);
@@ -733,6 +749,14 @@ namespace AIStudio.Wpf.DiagramDesigner
Mediator.Instance.Register(this); Mediator.Instance.Register(this);
Items.CollectionChanged += Items_CollectionChanged; 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() public DiagramViewModel(DiagramItem diagramItem) : this()

View File

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