|
|
|
@ -49,6 +49,12 @@ namespace Avalonia.Controls |
|
|
|
public static readonly StyledProperty<Orientation> OrientationProperty = |
|
|
|
ScrollBar.OrientationProperty.AddOwner<Slider>(); |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Defines the <see cref="IsDirectionReversed"/> property.
|
|
|
|
/// </summary>
|
|
|
|
public static readonly StyledProperty<bool> IsDirectionReversedProperty = |
|
|
|
Track.IsDirectionReversedProperty.AddOwner<Slider>(); |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Defines the <see cref="IsSnapToTickEnabled"/> property.
|
|
|
|
/// </summary>
|
|
|
|
@ -83,7 +89,6 @@ namespace Avalonia.Controls |
|
|
|
private IDisposable _increaseButtonSubscription; |
|
|
|
private IDisposable _increaseButtonReleaseDispose; |
|
|
|
private IDisposable _pointerMovedDispose; |
|
|
|
private IDisposable _trackOnKeyDownDispose; |
|
|
|
|
|
|
|
private const double Tolerance = 0.0001; |
|
|
|
|
|
|
|
@ -93,6 +98,7 @@ namespace Avalonia.Controls |
|
|
|
static Slider() |
|
|
|
{ |
|
|
|
PressedMixin.Attach<Slider>(); |
|
|
|
FocusableProperty.OverrideDefaultValue<Slider>(true); |
|
|
|
OrientationProperty.OverrideDefaultValue(typeof(Slider), Orientation.Horizontal); |
|
|
|
Thumb.DragStartedEvent.AddClassHandler<Slider>((x, e) => x.OnThumbDragStarted(e), RoutingStrategies.Bubble); |
|
|
|
Thumb.DragCompletedEvent.AddClassHandler<Slider>((x, e) => x.OnThumbDragCompleted(e), |
|
|
|
@ -127,6 +133,19 @@ namespace Avalonia.Controls |
|
|
|
set { SetValue(OrientationProperty, value); } |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Gets or sets the direction of increasing value.
|
|
|
|
/// </summary>
|
|
|
|
/// <value>
|
|
|
|
/// true if the direction of increasing value is to the left for a horizontal slider or
|
|
|
|
/// down for a vertical slider; otherwise, false. The default is false.
|
|
|
|
/// </value>
|
|
|
|
public bool IsDirectionReversed |
|
|
|
{ |
|
|
|
get { return GetValue(IsDirectionReversedProperty); } |
|
|
|
set { SetValue(IsDirectionReversedProperty, value); } |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Gets or sets a value that indicates whether the <see cref="Slider"/> automatically moves the <see cref="Thumb"/> to the closest tick mark.
|
|
|
|
/// </summary>
|
|
|
|
@ -165,7 +184,6 @@ namespace Avalonia.Controls |
|
|
|
_increaseButtonSubscription?.Dispose(); |
|
|
|
_increaseButtonReleaseDispose?.Dispose(); |
|
|
|
_pointerMovedDispose?.Dispose(); |
|
|
|
_trackOnKeyDownDispose?.Dispose(); |
|
|
|
|
|
|
|
_decreaseButton = e.NameScope.Find<Button>("PART_DecreaseButton"); |
|
|
|
_track = e.NameScope.Find<Track>("PART_Track"); |
|
|
|
@ -174,7 +192,6 @@ namespace Avalonia.Controls |
|
|
|
if (_track != null) |
|
|
|
{ |
|
|
|
_track.IsThumbDragHandled = true; |
|
|
|
_trackOnKeyDownDispose = _track.AddDisposableHandler(KeyDownEvent, TrackOnKeyDown); |
|
|
|
} |
|
|
|
|
|
|
|
if (_decreaseButton != null) |
|
|
|
@ -192,26 +209,32 @@ namespace Avalonia.Controls |
|
|
|
_pointerMovedDispose = this.AddDisposableHandler(PointerMovedEvent, TrackMoved, RoutingStrategies.Tunnel); |
|
|
|
} |
|
|
|
|
|
|
|
private void TrackOnKeyDown(object sender, KeyEventArgs e) |
|
|
|
protected override void OnKeyDown(KeyEventArgs e) |
|
|
|
{ |
|
|
|
if (e.KeyModifiers != KeyModifiers.None) return; |
|
|
|
base.OnKeyDown(e); |
|
|
|
|
|
|
|
if (e.Handled || e.KeyModifiers != KeyModifiers.None) return; |
|
|
|
|
|
|
|
var handled = true; |
|
|
|
|
|
|
|
switch (e.Key) |
|
|
|
{ |
|
|
|
case Key.Down: |
|
|
|
case Key.Left: |
|
|
|
MoveToNextTick(-SmallChange); |
|
|
|
MoveToNextTick(IsDirectionReversed ? SmallChange : -SmallChange); |
|
|
|
break; |
|
|
|
|
|
|
|
case Key.Up: |
|
|
|
case Key.Right: |
|
|
|
MoveToNextTick(SmallChange); |
|
|
|
MoveToNextTick(IsDirectionReversed ? -SmallChange : SmallChange); |
|
|
|
break; |
|
|
|
|
|
|
|
case Key.PageUp: |
|
|
|
MoveToNextTick(-LargeChange); |
|
|
|
MoveToNextTick(IsDirectionReversed ? -LargeChange : LargeChange); |
|
|
|
break; |
|
|
|
|
|
|
|
case Key.PageDown: |
|
|
|
MoveToNextTick(LargeChange); |
|
|
|
MoveToNextTick(IsDirectionReversed ? LargeChange : -LargeChange); |
|
|
|
break; |
|
|
|
|
|
|
|
case Key.Home: |
|
|
|
@ -221,7 +244,13 @@ namespace Avalonia.Controls |
|
|
|
case Key.End: |
|
|
|
Value = Maximum; |
|
|
|
break; |
|
|
|
|
|
|
|
default: |
|
|
|
handled = false; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
e.Handled = handled; |
|
|
|
} |
|
|
|
|
|
|
|
private void MoveToNextTick(double direction) |
|
|
|
|