Browse Source

Fix slider

pull/1132/head
Eli Arbel 9 years ago
parent
commit
aa45cccec4
  1. 4
      src/Avalonia.Controls/Primitives/Track.cs
  2. 21
      src/Avalonia.Controls/Slider.cs
  3. 4
      tests/Avalonia.Controls.UnitTests/Primitives/TrackTests.cs

4
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;

21
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>

4
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]

Loading…
Cancel
Save