Browse Source

Attach animations in styles.

pull/8600/head
Steven Kirk 4 years ago
parent
commit
2d38eb8264
  1. 6
      src/Avalonia.Base/Styling/StyleBase.cs
  2. 33
      src/Avalonia.Base/Styling/StyleInstance.cs

6
src/Avalonia.Base/Styling/StyleBase.cs

@ -99,7 +99,7 @@ namespace Avalonia.Styling
instance = new StyleInstance(this, activator);
if (_setters is object)
if (_setters is not null)
{
foreach (var setter in _setters)
{
@ -109,6 +109,9 @@ namespace Avalonia.Styling
}
}
if (_animations is not null)
instance.Add(_animations);
if (canShareInstance)
{
instance.MakeShared();
@ -117,6 +120,7 @@ namespace Avalonia.Styling
}
ao.GetValueStore().AddFrame(instance);
instance.ApplyAnimations(ao);
return instance;
}

33
src/Avalonia.Base/Styling/StyleInstance.cs

@ -1,5 +1,8 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reactive.Subjects;
using Avalonia.Animation;
using Avalonia.Data;
using Avalonia.PropertyStore;
using Avalonia.Styling.Activators;
@ -20,6 +23,8 @@ namespace Avalonia.Styling
{
private readonly IStyleActivator? _activator;
private List<ISetterInstance>? _setters;
private List<IAnimation>? _animations;
private Subject<bool>? _animationTrigger;
public StyleInstance(IStyle style, IStyleActivator? activator)
{
@ -35,7 +40,11 @@ namespace Avalonia.Styling
get
{
if (_activator?.IsSubscribed == false)
{
_activator.Subscribe(this);
_animationTrigger?.OnNext(_activator.IsActive);
}
return _activator?.IsActive ?? true;
}
}
@ -55,6 +64,24 @@ namespace Avalonia.Styling
(_setters ??= new()).Add(instance);
}
public void Add(IList<IAnimation> animations)
{
if (_animations is null)
_animations = new List<IAnimation>(animations);
else
_animations.AddRange(animations);
}
public void ApplyAnimations(AvaloniaObject control)
{
if (_animations is not null && control is Animatable animatable)
{
_animationTrigger ??= new Subject<bool>();
foreach (var animation in _animations)
animation.Apply(animatable, null, _animationTrigger);
}
}
public override void Dispose()
{
base.Dispose();
@ -63,6 +90,10 @@ namespace Avalonia.Styling
public new void MakeShared() => base.MakeShared();
void IStyleActivatorSink.OnNext(bool value, int tag) => Owner?.OnFrameActivationChanged(this);
void IStyleActivatorSink.OnNext(bool value, int tag)
{
Owner?.OnFrameActivationChanged(this);
_animationTrigger?.OnNext(value);
}
}
}

Loading…
Cancel
Save