1
+ using System ;
2
+ using System . Windows ;
3
+ using System . Windows . Media ;
4
+ using System . Windows . Media . Animation ;
5
+
6
+ namespace MaterialDesignThemes . Wpf . Transitions
7
+ {
8
+ public class SlideWipe : ITransitionWipe
9
+ {
10
+ private readonly SineEase _sineEase = new SineEase ( ) ;
11
+
12
+ /// <summary>
13
+ /// Direction of the slide wipe
14
+ /// </summary>
15
+ public SlideDirection Direction { get ; set ; }
16
+
17
+ /// <summary>
18
+ /// Duration of the animation
19
+ /// </summary>
20
+ public TimeSpan Duration { get ; set ; } = TimeSpan . FromSeconds ( 0.5 ) ;
21
+
22
+ public void Wipe ( TransitionerSlide fromSlide , TransitionerSlide toSlide , Point origin , IZIndexController zIndexController )
23
+ {
24
+ if ( fromSlide == null ) throw new ArgumentNullException ( nameof ( fromSlide ) ) ;
25
+ if ( toSlide == null ) throw new ArgumentNullException ( nameof ( toSlide ) ) ;
26
+ if ( zIndexController == null ) throw new ArgumentNullException ( nameof ( zIndexController ) ) ;
27
+
28
+ // Set up time points
29
+ var zeroKeyTime = KeyTime . FromTimeSpan ( TimeSpan . Zero ) ;
30
+ var endKeyTime = KeyTime . FromTimeSpan ( Duration ) ;
31
+
32
+ // Set up coordinates
33
+ double fromStartX = 0 , fromEndX = 0 , toStartX = 0 , toEndX = 0 ;
34
+ double fromStartY = 0 , fromEndY = 0 , toStartY = 0 , toEndY = 0 ;
35
+
36
+ if ( Direction == SlideDirection . Left )
37
+ {
38
+ fromEndX = - fromSlide . ActualWidth ;
39
+ toStartX = toSlide . ActualWidth ;
40
+ }
41
+ else if ( Direction == SlideDirection . Right )
42
+ {
43
+ fromEndX = fromSlide . ActualWidth ;
44
+ toStartX = - toSlide . ActualWidth ;
45
+ }
46
+ else if ( Direction == SlideDirection . Up )
47
+ {
48
+ fromEndY = - fromSlide . ActualHeight ;
49
+ toStartY = toSlide . ActualHeight ;
50
+ }
51
+ else if ( Direction == SlideDirection . Down )
52
+ {
53
+ fromEndY = fromSlide . ActualHeight ;
54
+ toStartY = - toSlide . ActualHeight ;
55
+ }
56
+
57
+ // From
58
+ var fromTransform = new TranslateTransform ( fromStartX , fromStartY ) ;
59
+ fromSlide . RenderTransform = fromTransform ;
60
+ var fromXAnimation = new DoubleAnimationUsingKeyFrames ( ) ;
61
+ fromXAnimation . KeyFrames . Add ( new LinearDoubleKeyFrame ( fromStartX , zeroKeyTime ) ) ;
62
+ fromXAnimation . KeyFrames . Add ( new EasingDoubleKeyFrame ( fromEndX , endKeyTime , _sineEase ) ) ;
63
+ var fromYAnimation = new DoubleAnimationUsingKeyFrames ( ) ;
64
+ fromYAnimation . KeyFrames . Add ( new LinearDoubleKeyFrame ( fromStartY , zeroKeyTime ) ) ;
65
+ fromYAnimation . KeyFrames . Add ( new EasingDoubleKeyFrame ( fromEndY , endKeyTime , _sineEase ) ) ;
66
+
67
+ // To
68
+ var toTransform = new TranslateTransform ( toStartX , toStartY ) ;
69
+ toSlide . RenderTransform = toTransform ;
70
+ var toXAnimation = new DoubleAnimationUsingKeyFrames ( ) ;
71
+ toXAnimation . KeyFrames . Add ( new LinearDoubleKeyFrame ( toStartX , zeroKeyTime ) ) ;
72
+ toXAnimation . KeyFrames . Add ( new EasingDoubleKeyFrame ( toEndX , endKeyTime , _sineEase ) ) ;
73
+ var toYAnimation = new DoubleAnimationUsingKeyFrames ( ) ;
74
+ toYAnimation . KeyFrames . Add ( new LinearDoubleKeyFrame ( toStartY , zeroKeyTime ) ) ;
75
+ toYAnimation . KeyFrames . Add ( new EasingDoubleKeyFrame ( toEndY , endKeyTime , _sineEase ) ) ;
76
+
77
+ // Set up events
78
+ fromXAnimation . Completed += ( sender , args ) =>
79
+ {
80
+ fromTransform . BeginAnimation ( TranslateTransform . XProperty , null ) ;
81
+ fromTransform . X = fromEndX ;
82
+ fromSlide . RenderTransform = null ;
83
+ } ;
84
+ fromYAnimation . Completed += ( sender , args ) =>
85
+ {
86
+ fromTransform . BeginAnimation ( TranslateTransform . YProperty , null ) ;
87
+ fromTransform . Y = fromEndY ;
88
+ fromSlide . RenderTransform = null ;
89
+ } ;
90
+ toXAnimation . Completed += ( sender , args ) =>
91
+ {
92
+ toTransform . BeginAnimation ( TranslateTransform . XProperty , null ) ;
93
+ toTransform . X = toEndX ;
94
+ toSlide . RenderTransform = null ;
95
+ } ;
96
+ toYAnimation . Completed += ( sender , args ) =>
97
+ {
98
+ toTransform . BeginAnimation ( TranslateTransform . YProperty , null ) ;
99
+ toTransform . Y = toEndY ;
100
+ toSlide . RenderTransform = null ;
101
+ } ;
102
+
103
+ // Animate
104
+ fromTransform . BeginAnimation ( TranslateTransform . XProperty , fromXAnimation ) ;
105
+ fromTransform . BeginAnimation ( TranslateTransform . YProperty , fromYAnimation ) ;
106
+ toTransform . BeginAnimation ( TranslateTransform . XProperty , toXAnimation ) ;
107
+ toTransform . BeginAnimation ( TranslateTransform . YProperty , toYAnimation ) ;
108
+ zIndexController . Stack ( toSlide , fromSlide ) ;
109
+ }
110
+ }
111
+ }
0 commit comments