Browse Source

Prevent ScrollBar collapsing during active thumb drag (#20563)

release/latest
Compunet 1 month ago
committed by Julien Lebosquain
parent
commit
2ac10d0f7d
No known key found for this signature in database GPG Key ID: 1833CAD10ACC46FD
  1. 17
      src/Avalonia.Controls/Primitives/ScrollBar.cs
  2. 3
      tests/Avalonia.Controls.UnitTests/Primitives/ScrollBarTests.cs

17
src/Avalonia.Controls/Primitives/ScrollBar.cs

@ -85,6 +85,7 @@ namespace Avalonia.Controls.Primitives
private bool _isExpanded; private bool _isExpanded;
private CompositeDisposable? _ownerSubscriptions; private CompositeDisposable? _ownerSubscriptions;
private ScrollViewer? _owner; private ScrollViewer? _owner;
private bool _isDragging;
/// <summary> /// <summary>
/// Initializes static members of the <see cref="ScrollBar"/> class. /// Initializes static members of the <see cref="ScrollBar"/> class.
@ -92,6 +93,7 @@ namespace Avalonia.Controls.Primitives
static ScrollBar() static ScrollBar()
{ {
Thumb.DragDeltaEvent.AddClassHandler<ScrollBar>((x, e) => x.OnThumbDragDelta(e), RoutingStrategies.Bubble); Thumb.DragDeltaEvent.AddClassHandler<ScrollBar>((x, e) => x.OnThumbDragDelta(e), RoutingStrategies.Bubble);
Thumb.DragStartedEvent.AddClassHandler<ScrollBar>((x, e) => x.OnThumbDragStart(e), RoutingStrategies.Bubble);
Thumb.DragCompletedEvent.AddClassHandler<ScrollBar>((x, e) => x.OnThumbDragComplete(e), RoutingStrategies.Bubble); Thumb.DragCompletedEvent.AddClassHandler<ScrollBar>((x, e) => x.OnThumbDragComplete(e), RoutingStrategies.Bubble);
FocusableProperty.OverrideMetadata<ScrollBar>(new(false)); FocusableProperty.OverrideMetadata<ScrollBar>(new(false));
@ -325,7 +327,7 @@ namespace Avalonia.Controls.Primitives
{ {
base.OnPointerExited(e); base.OnPointerExited(e);
if (AllowAutoHide) if (AllowAutoHide && !_isDragging)
{ {
CollapseAfterDelay(); CollapseAfterDelay();
} }
@ -491,8 +493,21 @@ namespace Avalonia.Controls.Primitives
{ {
OnScroll(ScrollEventType.ThumbTrack); OnScroll(ScrollEventType.ThumbTrack);
} }
private void OnThumbDragStart(VectorEventArgs e)
{
_isDragging = true;
}
private void OnThumbDragComplete(VectorEventArgs e) private void OnThumbDragComplete(VectorEventArgs e)
{ {
_isDragging = false;
if (AllowAutoHide && !IsPointerOver)
{
CollapseAfterDelay();
}
OnScroll(ScrollEventType.EndScroll); OnScroll(ScrollEventType.EndScroll);
} }

3
tests/Avalonia.Controls.UnitTests/Primitives/ScrollBarTests.cs

@ -4,11 +4,12 @@ using Avalonia.Controls.Primitives;
using Avalonia.Controls.Templates; using Avalonia.Controls.Templates;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Media; using Avalonia.Media;
using Avalonia.UnitTests;
using Xunit; using Xunit;
namespace Avalonia.Controls.UnitTests.Primitives namespace Avalonia.Controls.UnitTests.Primitives
{ {
public class ScrollBarTests public class ScrollBarTests : ScopedTestBase
{ {
[Fact] [Fact]
public void Setting_Value_Should_Update_Track_Value() public void Setting_Value_Should_Update_Track_Value()

Loading…
Cancel
Save