@@ -10,9 +10,12 @@ namespace GenshinWoodmen.Views
1010 /// </summary>
1111 public class PanAndZoomCanvas : Canvas
1212 {
13- public MatrixTransform ? Transform { get ; protected set ; } = null ! ;
14- public float Zoomfactor { get ; set ; } = 1.25f ;
13+ public MatrixTransform Transform { get ; set ; } = new ( ) ;
14+ public float ? MinDeterminant { get ; set ; } = null ! ;
15+ public float ? MaxDeterminant { get ; set ; } = null ! ;
16+ public float Zoomfactor { get ; set ; } = 1.333f ;
1517 protected Point MousePosition = new ( ) ;
18+ protected bool DownFlow = false ;
1619
1720 public PanAndZoomCanvas ( )
1821 {
@@ -24,21 +27,21 @@ public PanAndZoomCanvas()
2427
2528 private void OnMouseDown ( object sender , MouseButtonEventArgs e )
2629 {
27- if ( e . ChangedButton == MouseButton . Left )
30+ if ( e . ChangedButton == MouseButton . Left && e . ClickCount == 1 )
2831 {
29- Transform ??= new ( ) ;
3032 MousePosition = Transform . Inverse . Transform ( e . GetPosition ( this ) ) ;
33+ DownFlow = true ;
3134 }
3235 }
3336
3437 private void OnMouseUp ( object sender , MouseButtonEventArgs e )
3538 {
39+ DownFlow = false ;
3640 }
3741
3842 private void OnMouseMove ( object sender , MouseEventArgs e )
3943 {
40- if ( Transform == null ) return ;
41- if ( e . LeftButton == MouseButtonState . Pressed )
44+ if ( e . LeftButton == MouseButtonState . Pressed && DownFlow )
4245 {
4346 Point mousePosition = Transform . Inverse . Transform ( e . GetPosition ( this ) ) ;
4447 Vector delta = Point . Subtract ( mousePosition , MousePosition ) ;
@@ -62,23 +65,29 @@ private void OnMouseWheel(object sender, MouseWheelEventArgs e)
6265
6366 Point mousePostion = e . GetPosition ( this ) ;
6467
65- Matrix scaleMatrix = ( Transform ??= new ( ) ) . Matrix ;
68+ Matrix scaleMatrix = Transform . Matrix ;
6669 scaleMatrix . ScaleAt ( scaleFactor , scaleFactor , mousePostion . X , mousePostion . Y ) ;
70+ if ( scaleMatrix . Determinant <= MinDeterminant || scaleMatrix . Determinant >= MaxDeterminant ) return ;
6771 Transform . Matrix = scaleMatrix ;
6872
73+ SetTransform ( Transform ) ;
74+ }
75+
76+ public void SetTransform ( MatrixTransform transform )
77+ {
6978 foreach ( UIElement child in Children )
7079 {
7180 double x = Canvas . GetLeft ( child ) ;
7281 double y = Canvas . GetTop ( child ) ;
7382
74- double sx = x * scaleFactor ;
75- double sy = y * scaleFactor ;
83+ double sx = x ;
84+ double sy = y ;
7685
7786 Canvas . SetLeft ( child , sx ) ;
7887 Canvas . SetTop ( child , sy ) ;
7988
80- child . RenderTransform = Transform ;
89+ child . RenderTransform = Transform = transform ;
8190 }
8291 }
8392 }
84- }
93+ }
0 commit comments