mirror of
https://gitee.com/akwkevin/aistudio.-wpf.-diagram
synced 2026-03-02 15:50:51 +08:00
ZoomBox待完成,还需要调整
This commit is contained in:
@@ -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();
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user