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();