diff --git a/src/Avalonia.Controls/Primitives/Track.cs b/src/Avalonia.Controls/Primitives/Track.cs index eee54079f7..a9b6afc172 100644 --- a/src/Avalonia.Controls/Primitives/Track.cs +++ b/src/Avalonia.Controls/Primitives/Track.cs @@ -128,7 +128,7 @@ namespace Avalonia.Controls.Primitives if (Orientation == Orientation.Horizontal) { - var thumbWidth = double.IsNaN(viewportSize) ? finalSize.Width : finalSize.Width * viewportSize / extent; + var thumbWidth = double.IsNaN(viewportSize) ? thumb?.DesiredSize.Width ?? 0 : finalSize.Width * viewportSize / extent; var remaining = finalSize.Width - thumbWidth; var firstWidth = range <= 0 ? 0 : remaining * offset / range; @@ -149,7 +149,7 @@ namespace Avalonia.Controls.Primitives } else { - var thumbHeight = double.IsNaN(viewportSize) ? finalSize.Height : finalSize.Height * viewportSize / extent; + var thumbHeight = double.IsNaN(viewportSize) ? thumb?.DesiredSize.Height ?? 0 : finalSize.Height * viewportSize / extent; var remaining = finalSize.Height - thumbHeight; var firstHeight = range <= 0 ? 0 : remaining * offset / range; diff --git a/src/Avalonia.Controls/Slider.cs b/src/Avalonia.Controls/Slider.cs index beef4e842e..2ef0af2852 100644 --- a/src/Avalonia.Controls/Slider.cs +++ b/src/Avalonia.Controls/Slider.cs @@ -46,6 +46,8 @@ namespace Avalonia.Controls Thumb.DragStartedEvent.AddClassHandler(x => x.OnThumbDragStarted, RoutingStrategies.Bubble); Thumb.DragDeltaEvent.AddClassHandler(x => x.OnThumbDragDelta, RoutingStrategies.Bubble); Thumb.DragCompletedEvent.AddClassHandler(x => x.OnThumbDragCompleted, RoutingStrategies.Bubble); + SmallChangeProperty.OverrideDefaultValue(1); + LargeChangeProperty.OverrideDefaultValue(10); } /// @@ -112,12 +114,27 @@ namespace Avalonia.Controls private void DecreaseClick(object sender, RoutedEventArgs e) { - Value = Math.Max(Value - LargeChange, Minimum); + ChangeValueBy(-LargeChange); } private void IncreaseClick(object sender, RoutedEventArgs e) { - Value = Math.Min(Value + LargeChange, Maximum); + ChangeValueBy(LargeChange); + } + + private void ChangeValueBy(double by) + { + if (IsSnapToTickEnabled) + { + by = by < 0 ? Math.Min(-TickFrequency, by) : Math.Max(TickFrequency, by); + } + + var value = Value; + var next = SnapToTick(Math.Max(Math.Min(value + by, Maximum), Minimum)); + if (next != value) + { + Value = next; + } } /// diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/TrackTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/TrackTests.cs index 2a16e81ab7..f07a5f5095 100644 --- a/tests/Avalonia.Controls.UnitTests/Primitives/TrackTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Primitives/TrackTests.cs @@ -98,7 +98,7 @@ namespace Avalonia.Controls.UnitTests.Primitives } [Fact] - public void Thumb_Should_Fill_Track_When_Minimum_Equals_Maximum() + public void Thumb_Should_Have_Zero_Width_When_Minimum_Equals_Maximum() { var thumb = new Thumb { @@ -117,7 +117,7 @@ namespace Avalonia.Controls.UnitTests.Primitives target.Measure(new Size(100, 100)); target.Arrange(new Rect(0, 0, 100, 100)); - Assert.Equal(new Rect(0, 0, 100, 12), thumb.Bounds); + Assert.Equal(new Rect(0, 0, 0, 12), thumb.Bounds); } [Fact]