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) 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 remaining = finalSize.Width - thumbWidth;
var firstWidth = range <= 0 ? 0 : remaining * offset / range; var firstWidth = range <= 0 ? 0 : remaining * offset / range;
@ -149,7 +149,7 @@ namespace Avalonia.Controls.Primitives
} }
else 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 remaining = finalSize.Height - thumbHeight;
var firstHeight = range <= 0 ? 0 : remaining * offset / range; 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.DragStartedEvent.AddClassHandler<Slider>(x => x.OnThumbDragStarted, RoutingStrategies.Bubble);
Thumb.DragDeltaEvent.AddClassHandler<Slider>(x => x.OnThumbDragDelta, RoutingStrategies.Bubble); Thumb.DragDeltaEvent.AddClassHandler<Slider>(x => x.OnThumbDragDelta, RoutingStrategies.Bubble);
Thumb.DragCompletedEvent.AddClassHandler<Slider>(x => x.OnThumbDragCompleted, RoutingStrategies.Bubble); Thumb.DragCompletedEvent.AddClassHandler<Slider>(x => x.OnThumbDragCompleted, RoutingStrategies.Bubble);
SmallChangeProperty.OverrideDefaultValue<Slider>(1);
LargeChangeProperty.OverrideDefaultValue<Slider>(10);
} }
/// <summary> /// <summary>
@ -112,12 +114,27 @@ namespace Avalonia.Controls
private void DecreaseClick(object sender, RoutedEventArgs e) private void DecreaseClick(object sender, RoutedEventArgs e)
{ {
Value = Math.Max(Value - LargeChange, Minimum); ChangeValueBy(-LargeChange);
} }
private void IncreaseClick(object sender, RoutedEventArgs e) 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> /// <summary>

4
tests/Avalonia.Controls.UnitTests/Primitives/TrackTests.cs

@ -98,7 +98,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
} }
[Fact] [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 var thumb = new Thumb
{ {
@ -117,7 +117,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
target.Measure(new Size(100, 100)); target.Measure(new Size(100, 100));
target.Arrange(new Rect(0, 0, 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] [Fact]

Loading…
Cancel
Save