diff --git a/src/Avalonia.Visuals/Animation/CrossFade.cs b/src/Avalonia.Visuals/Animation/CrossFade.cs
index 410ad0a3b3..307fb691ac 100644
--- a/src/Avalonia.Visuals/Animation/CrossFade.cs
+++ b/src/Avalonia.Visuals/Animation/CrossFade.cs
@@ -5,6 +5,7 @@ using System;
using System.Collections.Generic;
using System.Reactive.Threading.Tasks;
using System.Threading.Tasks;
+using Avalonia.Styling;
using Avalonia.VisualTree;
namespace Avalonia.Animation
@@ -14,10 +15,14 @@ namespace Avalonia.Animation
///
public class CrossFade : IPageTransition
{
+ private Animation _fadeOutAnimation;
+ private Animation _fadeInAnimation;
+
///
/// Initializes a new instance of the class.
///
public CrossFade()
+ :this(TimeSpan.Zero)
{
}
@@ -27,13 +32,62 @@ namespace Avalonia.Animation
/// The duration of the animation.
public CrossFade(TimeSpan duration)
{
- Duration = duration;
+ _fadeOutAnimation = new Animation
+ {
+ new KeyFrame
+ (
+ new Setter
+ {
+ Property = Visual.OpacityProperty,
+ Value = 0.0
+ }
+ )
+ {
+ Cue = new Cue(1.0)
+ }
+ };
+ _fadeInAnimation = new Animation
+ {
+ new KeyFrame
+ (
+ new Setter
+ {
+ Property = Visual.OpacityProperty,
+ Value = 0.0
+ }
+ )
+ {
+ Cue = new Cue(0.0)
+ },
+ new KeyFrame
+ (
+ new Setter
+ {
+ Property = Visual.OpacityProperty,
+ Value = 1.0
+ }
+ )
+ {
+ Cue = new Cue(1.0)
+ }
+ };
+ _fadeOutAnimation.Duration = _fadeInAnimation.Duration = duration;
}
///
/// Gets the duration of the animation.
///
- public TimeSpan Duration { get; set; }
+ public TimeSpan Duration
+ {
+ get
+ {
+ return _fadeOutAnimation.Duration;
+ }
+ set
+ {
+ _fadeOutAnimation.Duration = _fadeInAnimation.Duration = value;
+ }
+ }
///
/// Starts the animation.
@@ -51,26 +105,25 @@ namespace Avalonia.Animation
{
var tasks = new List();
- // TODO: Implement relevant transition logic here (or discard this class)
- // in favor of XAML based transition for pages
if (to != null)
{
to.Opacity = 0;
}
- if (from != null)
+ if (from is Animatable fadeOut)
{
+ tasks.Add(_fadeOutAnimation.RunAsync(fadeOut));
}
- if (to != null)
+ if (to is Animatable fadeIn)
{
to.Opacity = 0;
to.IsVisible = true;
+ tasks.Add(_fadeInAnimation.RunAsync(fadeIn));
}
- // FIXME: This is temporary until animations are fixed.
- await Task.Delay(1);
+ await Task.WhenAll(tasks);
if (from != null)
{