diff --git a/src/Avalonia.Base/AvaloniaObject.cs b/src/Avalonia.Base/AvaloniaObject.cs index efcbb57244..8b93cf2fb1 100644 --- a/src/Avalonia.Base/AvaloniaObject.cs +++ b/src/Avalonia.Base/AvaloniaObject.cs @@ -225,6 +225,19 @@ namespace Avalonia return (T)GetValue((AvaloniaProperty)property); } + /// + /// Checks whether a is animating. + /// + /// The property. + /// True if the property is animating, otherwise false. + public bool IsAnimating(AvaloniaProperty property) + { + Contract.Requires(property != null); + VerifyAccess(); + + return _values.TryGetValue(property, out PriorityValue value) ? value.IsAnimating : false; + } + /// /// Checks whether a is set on this object. /// diff --git a/src/Avalonia.Base/IAvaloniaObject.cs b/src/Avalonia.Base/IAvaloniaObject.cs index c11bab2236..c11f8ada7e 100644 --- a/src/Avalonia.Base/IAvaloniaObject.cs +++ b/src/Avalonia.Base/IAvaloniaObject.cs @@ -31,6 +31,13 @@ namespace Avalonia /// The value. T GetValue(AvaloniaProperty property); + /// + /// Checks whether a is animating. + /// + /// The property. + /// True if the property is animating, otherwise false. + bool IsAnimating(AvaloniaProperty property); + /// /// Checks whether a is set on this object. /// diff --git a/src/Avalonia.Base/PriorityValue.cs b/src/Avalonia.Base/PriorityValue.cs index 3726fb7ae5..e1b62c030c 100644 --- a/src/Avalonia.Base/PriorityValue.cs +++ b/src/Avalonia.Base/PriorityValue.cs @@ -52,6 +52,8 @@ namespace Avalonia _validate = validate; } + public bool IsAnimating => ValuePriority < 0 && GetLevel(ValuePriority).ActiveBindingIndex != -1; + /// /// Gets the owner of the value. /// diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs index 4d6559a078..cd77d9cc88 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs @@ -387,6 +387,46 @@ namespace Avalonia.Base.UnitTests } } + [Fact] + public void IsAnimating_On_Property_With_No_Value_Returns_False() + { + var target = new Class1(); + + Assert.False(target.IsAnimating(Class1.FooProperty)); + } + + [Fact] + public void IsAnimating_On_Property_With_Animation_Value_Returns_False() + { + var target = new Class1(); + + target.SetValue(Class1.FooProperty, "foo", BindingPriority.Animation); + + Assert.False(target.IsAnimating(Class1.FooProperty)); + } + + [Fact] + public void IsAnimating_On_Property_With_Non_Animation_Binding_Returns_False() + { + var target = new Class1(); + var source = new Subject(); + + target.Bind(Class1.FooProperty, source, BindingPriority.LocalValue); + + Assert.False(target.IsAnimating(Class1.FooProperty)); + } + + [Fact] + public void IsAnimating_On_Property_With_Animation_Binding_Returns_True() + { + var target = new Class1(); + var source = new BehaviorSubject("foo"); + + target.Bind(Class1.FooProperty, source, BindingPriority.Animation); + + Assert.True(target.IsAnimating(Class1.FooProperty)); + } + /// /// Returns an observable that returns a single value but does not complete. /// diff --git a/tests/Avalonia.Base.UnitTests/DirectPropertyTests.cs b/tests/Avalonia.Base.UnitTests/DirectPropertyTests.cs index 3a37585dc0..84ff492512 100644 --- a/tests/Avalonia.Base.UnitTests/DirectPropertyTests.cs +++ b/tests/Avalonia.Base.UnitTests/DirectPropertyTests.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. See licence.md file in the project root for full license information. using System; +using System.Reactive.Subjects; using Avalonia.Data; using Xunit; @@ -70,6 +71,17 @@ namespace Avalonia.Base.UnitTests Assert.Same(p1.Initialized, p2.Initialized); } + [Fact] + public void IsAnimating_On_DirectProperty_With_Binding_Returns_False() + { + var target = new Class1(); + var source = new BehaviorSubject("foo"); + + target.Bind(Class1.FooProperty, source, BindingPriority.Animation); + + Assert.False(target.IsAnimating(Class1.FooProperty)); + } + private class Class1 : AvaloniaObject { public static readonly DirectProperty FooProperty = diff --git a/tests/Avalonia.Styling.UnitTests/SelectorTests_Child.cs b/tests/Avalonia.Styling.UnitTests/SelectorTests_Child.cs index 352efe5358..d837f2cb2f 100644 --- a/tests/Avalonia.Styling.UnitTests/SelectorTests_Child.cs +++ b/tests/Avalonia.Styling.UnitTests/SelectorTests_Child.cs @@ -135,6 +135,11 @@ namespace Avalonia.Styling.UnitTests throw new NotImplementedException(); } + public bool IsAnimating(AvaloniaProperty property) + { + throw new NotImplementedException(); + } + public bool IsSet(AvaloniaProperty property) { throw new NotImplementedException(); diff --git a/tests/Avalonia.Styling.UnitTests/SelectorTests_Descendent.cs b/tests/Avalonia.Styling.UnitTests/SelectorTests_Descendent.cs index c413904c8f..b75b59c212 100644 --- a/tests/Avalonia.Styling.UnitTests/SelectorTests_Descendent.cs +++ b/tests/Avalonia.Styling.UnitTests/SelectorTests_Descendent.cs @@ -165,6 +165,11 @@ namespace Avalonia.Styling.UnitTests throw new NotImplementedException(); } + public bool IsAnimating(AvaloniaProperty property) + { + throw new NotImplementedException(); + } + public bool IsSet(AvaloniaProperty property) { throw new NotImplementedException(); diff --git a/tests/Avalonia.Styling.UnitTests/TestControlBase.cs b/tests/Avalonia.Styling.UnitTests/TestControlBase.cs index f57ac836fb..82be755a39 100644 --- a/tests/Avalonia.Styling.UnitTests/TestControlBase.cs +++ b/tests/Avalonia.Styling.UnitTests/TestControlBase.cs @@ -59,6 +59,11 @@ namespace Avalonia.Styling.UnitTests throw new NotImplementedException(); } + public bool IsAnimating(AvaloniaProperty property) + { + throw new NotImplementedException(); + } + public bool IsSet(AvaloniaProperty property) { throw new NotImplementedException(); diff --git a/tests/Avalonia.Styling.UnitTests/TestTemplatedControl.cs b/tests/Avalonia.Styling.UnitTests/TestTemplatedControl.cs index 07a988f410..03b2f03bf2 100644 --- a/tests/Avalonia.Styling.UnitTests/TestTemplatedControl.cs +++ b/tests/Avalonia.Styling.UnitTests/TestTemplatedControl.cs @@ -67,6 +67,11 @@ namespace Avalonia.Styling.UnitTests throw new NotImplementedException(); } + public bool IsAnimating(AvaloniaProperty property) + { + throw new NotImplementedException(); + } + public bool IsSet(AvaloniaProperty property) { throw new NotImplementedException();