From e7b99842bc139160b0be3821d653f15f87609484 Mon Sep 17 00:00:00 2001 From: rabbitism Date: Sat, 17 Feb 2024 15:16:49 +0800 Subject: [PATCH] feat: add a sample for date. --- .../Ursa.Demo/Pages/NumberDisplayerDemo.axaml | 1 + .../NumberDisplayerDemoViewModel.cs | 3 ++ .../NumberDisplayer/NumberDisplayer.cs | 32 +++++++++++++++++-- 3 files changed, 33 insertions(+), 3 deletions(-) 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); + } +}