From 36f0cf78c0be44de3d81a695f64ddf9ba50e117a Mon Sep 17 00:00:00 2001 From: rabbitism Date: Wed, 18 Dec 2024 14:10:07 +0800 Subject: [PATCH] feat: coerce speed to be larger than 0. only initialize timer after attached to visual tree. --- demo/Ursa.Demo/Pages/MarqueeDemo.axaml | 2 +- src/Ursa/Controls/Marquee/Marquee.cs | 52 ++++++++++++++------------ 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/demo/Ursa.Demo/Pages/MarqueeDemo.axaml b/demo/Ursa.Demo/Pages/MarqueeDemo.axaml index 244f606..eb79d11 100644 --- a/demo/Ursa.Demo/Pages/MarqueeDemo.axaml +++ b/demo/Ursa.Demo/Pages/MarqueeDemo.axaml @@ -30,7 +30,7 @@ Name="speed" AllowDrag="True" u:FormItem.Label="Speed" - Minimum="1" + Minimum="-100" Maximum="300" Value="60"/> property. /// public static readonly StyledProperty SpeedProperty = AvaloniaProperty.Register( - nameof(Speed), 60.0); + nameof(Speed), 60.0, coerce: OnCoerceSpeed); - private Timer _timer; + private static double OnCoerceSpeed(AvaloniaObject arg1, double arg2) + { + if (arg2 < 0) return 0; + return arg2; + } + + private Timer? _timer; static Marquee() { ClipToBoundsProperty.OverrideDefaultValue(true); HorizontalContentAlignmentProperty.OverrideDefaultValue(HorizontalAlignment.Center); VerticalContentAlignmentProperty.OverrideDefaultValue(VerticalAlignment.Center); - HorizontalContentAlignmentProperty.Changed.AddClassHandler((o,args)=>o.InvalidatePresenterPosition()); - VerticalContentAlignmentProperty.Changed.AddClassHandler((o,args)=>o.InvalidatePresenterPosition()); + HorizontalContentAlignmentProperty.Changed.AddClassHandler((o,_)=>o.InvalidatePresenterPosition()); + VerticalContentAlignmentProperty.Changed.AddClassHandler((o,_)=>o.InvalidatePresenterPosition()); IsRunningProperty.Changed.AddClassHandler((o, args) => o.OnIsRunningChanged(args)); } @@ -45,11 +50,11 @@ public class Marquee : ContentControl { if (args.NewValue.Value) { - _timer.Start(); + _timer?.Start(); } else { - _timer.Stop(); + _timer?.Stop(); } } @@ -62,20 +67,30 @@ public class Marquee : ContentControl protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) { base.OnAttachedToVisualTree(e); - _timer.Stop(); - _timer.Dispose(); + if (Presenter is not null) + { + Presenter.SizeChanged+= OnPresenterSizeChanged; + } + _timer?.Stop(); + _timer?.Dispose(); _timer = new Timer(); _timer.Interval = 1000 / 60.0; _timer.Elapsed += TimerOnTick; - _timer.Start(); + if (IsRunning) + { + _timer.Start(); + } } protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e) { base.OnDetachedFromVisualTree(e); - _timer.Elapsed -= TimerOnTick; - _timer.Stop(); - _timer.Dispose(); + if (_timer is not null) + { + _timer.Elapsed -= TimerOnTick; + _timer.Stop(); + _timer.Dispose(); + } if (Presenter is not null) { Presenter.SizeChanged -= OnPresenterSizeChanged; @@ -101,7 +116,7 @@ public class Marquee : ContentControl } /// - /// Gets or sets the speed of the marquee. + /// Gets or sets the speed of the marquee. Point per second. /// public double Speed { @@ -109,15 +124,6 @@ public class Marquee : ContentControl set => SetValue(SpeedProperty, value); } - protected override void OnApplyTemplate(TemplateAppliedEventArgs e) - { - base.OnApplyTemplate(e); - if (Presenter is not null) - { - Presenter.SizeChanged+= OnPresenterSizeChanged; - } - } - private void OnPresenterSizeChanged(object sender, SizeChangedEventArgs e) { InvalidatePresenterPosition();