Browse Source

Fix slider

Eli Arbel 8 years ago
parent
commit
aa45cccec4

+ 2 - 2
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;
 

+ 19 - 2
src/Avalonia.Controls/Slider.cs

@@ -46,6 +46,8 @@ namespace Avalonia.Controls
             Thumb.DragStartedEvent.AddClassHandler<Slider>(x => x.OnThumbDragStarted, RoutingStrategies.Bubble);
             Thumb.DragDeltaEvent.AddClassHandler<Slider>(x => x.OnThumbDragDelta, RoutingStrategies.Bubble);
             Thumb.DragCompletedEvent.AddClassHandler<Slider>(x => x.OnThumbDragCompleted, RoutingStrategies.Bubble);
+            SmallChangeProperty.OverrideDefaultValue<Slider>(1);
+            LargeChangeProperty.OverrideDefaultValue<Slider>(10);
         }
 
         /// <summary>
@@ -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;
+            }
         }
 
         /// <summary>

+ 2 - 2
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]