diff --git a/demo/Ursa.Demo/Pages/NumberDisplayerDemo.axaml b/demo/Ursa.Demo/Pages/NumberDisplayerDemo.axaml
index 0a7ec19..21f67cc 100644
--- a/demo/Ursa.Demo/Pages/NumberDisplayerDemo.axaml
+++ b/demo/Ursa.Demo/Pages/NumberDisplayerDemo.axaml
@@ -12,5 +12,6 @@
+
diff --git a/demo/Ursa.Demo/ViewModels/NumberDisplayerDemoViewModel.cs b/demo/Ursa.Demo/ViewModels/NumberDisplayerDemoViewModel.cs
index 0032e47..befdd5b 100644
--- a/demo/Ursa.Demo/ViewModels/NumberDisplayerDemoViewModel.cs
+++ b/demo/Ursa.Demo/ViewModels/NumberDisplayerDemoViewModel.cs
@@ -9,12 +9,14 @@ public partial class NumberDisplayerDemoViewModel: ObservableObject
{
[ObservableProperty] private int _value;
[ObservableProperty] private double _doubleValue;
+ [ObservableProperty] private DateTime _dateValue;
public ICommand IncreaseCommand { get; }
public NumberDisplayerDemoViewModel()
{
IncreaseCommand = new RelayCommand(OnChange);
Value = 0;
DoubleValue = 0d;
+ DateValue = DateTime.Now;
}
private void OnChange()
@@ -22,5 +24,6 @@ public partial class NumberDisplayerDemoViewModel: ObservableObject
Random r = new Random();
Value = r.Next(int.MaxValue);
DoubleValue = r.NextDouble() * 100000;
+ DateValue = DateTime.Today.AddDays(r.Next(1000));
}
}
\ No newline at end of file
diff --git a/src/Ursa/Controls/NumberDisplayer/NumberDisplayer.cs b/src/Ursa/Controls/NumberDisplayer/NumberDisplayer.cs
index 946d58e..3beff1e 100644
--- a/src/Ursa/Controls/NumberDisplayer/NumberDisplayer.cs
+++ b/src/Ursa/Controls/NumberDisplayer/NumberDisplayer.cs
@@ -91,6 +91,8 @@ public abstract class NumberDisplayer: NumberDisplayerBase
Setters = { new Setter{Property = InternalValueProperty } }
});
Animation.SetAnimator(_animation.Children[0].Setters[0], GetAnimator());
+ Animation.SetAnimator(_animation.Children[1].Setters[0], GetAnimator());
+ InternalValue = Value;
}
private void OnDurationChanged(AvaloniaPropertyChangedEventArgs args)
@@ -101,11 +103,12 @@ public abstract class NumberDisplayer: NumberDisplayerBase
protected virtual void OnValueChanged(T? oldValue, T? newValue)
{
+ if (_animation is null) return;
_cts.Cancel();
_cts = new CancellationTokenSource();
- (_animation?.Children[0].Setters[0] as Setter)!.Value = oldValue;
- (_animation?.Children[1].Setters[0] as Setter)!.Value = newValue;
- _animation?.RunAsync(this, _cts.Token);
+ (_animation.Children[0].Setters[0] as Setter)!.Value = oldValue;
+ (_animation.Children[1].Setters[0] as Setter)!.Value = newValue;
+ _animation.RunAsync(this, _cts.Token);
}
protected abstract InterpolatingAnimator GetAnimator();
@@ -159,3 +162,26 @@ public class DoubleDisplayer : NumberDisplayer
return value.ToString(StringFormat);
}
}
+
+public class DateDisplay : NumberDisplayer
+{
+ protected override Type StyleKeyOverride { get; } = typeof(NumberDisplayerBase);
+
+ protected override InterpolatingAnimator GetAnimator()
+ {
+ return new DateAnimator();
+ }
+
+ private class DateAnimator : InterpolatingAnimator
+ {
+ public override DateTime Interpolate(double progress, DateTime oldValue, DateTime newValue)
+ {
+ return oldValue + TimeSpan.FromTicks((long)((newValue - oldValue).Ticks * progress));
+ }
+ }
+
+ protected override string GetString(DateTime value)
+ {
+ return value.ToString(StringFormat);
+ }
+}