diff --git a/src/Avalonia.Controls/Expander.cs b/src/Avalonia.Controls/Expander.cs
index e7f75336f5..5323939b50 100644
--- a/src/Avalonia.Controls/Expander.cs
+++ b/src/Avalonia.Controls/Expander.cs
@@ -66,9 +66,7 @@ namespace Avalonia.Controls
protected virtual void OnIsExpandedChanged(AvaloniaPropertyChangedEventArgs e)
{
- IVisual visualContent = Presenter;
-
- if (Content != null && ContentTransition != null && visualContent != null)
+ if (Content != null && ContentTransition != null && Presenter is Visual visualContent)
{
bool forward = ExpandDirection == ExpandDirection.Left ||
ExpandDirection == ExpandDirection.Up;
@@ -87,4 +85,4 @@ namespace Avalonia.Controls
private ExpandDirection _expandDirection;
private bool _isExpanded;
}
-}
\ No newline at end of file
+}
diff --git a/src/Avalonia.Visuals/Animation/CrossFade.cs b/src/Avalonia.Visuals/Animation/CrossFade.cs
index 410ad0a3b3..2230f8534b 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,51 @@ 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)
+ }
+ };
+ _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.
@@ -47,12 +90,10 @@ namespace Avalonia.Animation
///
/// A that tracks the progress of the animation.
///
- public async Task Start(IVisual from, IVisual to)
+ public async Task Start(Visual from, Visual to)
{
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;
@@ -60,22 +101,21 @@ namespace Avalonia.Animation
if (from != null)
{
+ tasks.Add(_fadeOutAnimation.RunAsync(from));
}
if (to != null)
{
- to.Opacity = 0;
to.IsVisible = true;
+ tasks.Add(_fadeInAnimation.RunAsync(to));
}
- // FIXME: This is temporary until animations are fixed.
- await Task.Delay(1);
+ await Task.WhenAll(tasks);
if (from != null)
{
from.IsVisible = false;
- from.Opacity = 1;
}
if (to != null)
@@ -99,7 +139,7 @@ namespace Avalonia.Animation
///
/// A that tracks the progress of the animation.
///
- Task IPageTransition.Start(IVisual from, IVisual to, bool forward)
+ Task IPageTransition.Start(Visual from, Visual to, bool forward)
{
return Start(from, to);
}
diff --git a/src/Avalonia.Visuals/Animation/IPageTransition.cs b/src/Avalonia.Visuals/Animation/IPageTransition.cs
index 6dc64de049..88912c1931 100644
--- a/src/Avalonia.Visuals/Animation/IPageTransition.cs
+++ b/src/Avalonia.Visuals/Animation/IPageTransition.cs
@@ -26,6 +26,6 @@ namespace Avalonia.Animation
///
/// A that tracks the progress of the animation.
///
- Task Start(IVisual from, IVisual to, bool forward);
+ Task Start(Visual from, Visual to, bool forward);
}
}
diff --git a/src/Avalonia.Visuals/Animation/PageSlide.cs b/src/Avalonia.Visuals/Animation/PageSlide.cs
index 13f9e67d29..5f03dc6b0c 100644
--- a/src/Avalonia.Visuals/Animation/PageSlide.cs
+++ b/src/Avalonia.Visuals/Animation/PageSlide.cs
@@ -6,6 +6,7 @@ using System.Collections.Generic;
using System.Reactive.Threading.Tasks;
using System.Threading.Tasks;
using Avalonia.Media;
+using Avalonia.Styling;
using Avalonia.VisualTree;
namespace Avalonia.Animation
@@ -67,7 +68,7 @@ namespace Avalonia.Animation
///
/// A that tracks the progress of the animation.
///
- public async Task Start(IVisual from, IVisual to, bool forward)
+ public async Task Start(Visual from, Visual to, bool forward)
{
var tasks = new List();
var parent = GetVisualParent(from, to);
@@ -79,16 +80,69 @@ namespace Avalonia.Animation
// in favor of XAML based transition for pages
if (from != null)
{
-
+ var animation = new Animation
+ {
+ new KeyFrame
+ (
+ new Setter
+ {
+ Property = translateProperty,
+ Value = 0
+ }
+ )
+ {
+ Cue = new Cue(0.0)
+ },
+ new KeyFrame
+ (
+ new Setter
+ {
+ Property = translateProperty,
+ Value = forward ? -distance : distance
+ }
+ )
+ {
+ Cue = new Cue(1.0)
+ }
+ };
+ animation.Duration = Duration;
+ tasks.Add(animation.RunAsync(from));
}
if (to != null)
{
-
+ to.IsVisible = true;
+ var animation = new Animation
+ {
+
+ new KeyFrame
+ (
+ new Setter
+ {
+ Property = translateProperty,
+ Value = forward ? -distance : distance
+ }
+ )
+ {
+ Cue = new Cue(0.0)
+ },
+ new KeyFrame
+ (
+ new Setter
+ {
+ Property = translateProperty,
+ Value = 0
+ }
+ )
+ {
+ Cue = new Cue(1.0)
+ },
+ };
+ animation.Duration = Duration;
+ tasks.Add(animation.RunAsync(to));
}
- // FIXME: This is temporary until animations are fixed.
- await Task.Delay(1);
+ await Task.WhenAll(tasks);
if (from != null)
{