diff --git a/samples/ControlCatalog/MainView.xaml b/samples/ControlCatalog/MainView.xaml
index fef68bb5f5..488062f5b6 100644
--- a/samples/ControlCatalog/MainView.xaml
+++ b/samples/ControlCatalog/MainView.xaml
@@ -52,6 +52,7 @@
+
diff --git a/samples/ControlCatalog/Pages/ScrollViewerPage.xaml b/samples/ControlCatalog/Pages/ScrollViewerPage.xaml
new file mode 100644
index 0000000000..bbefcab9ca
--- /dev/null
+++ b/samples/ControlCatalog/Pages/ScrollViewerPage.xaml
@@ -0,0 +1,35 @@
+
+
+ ScrollViewer
+ Allows for horizontal and vertical content scrolling.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ControlCatalog/Pages/ScrollViewerPage.xaml.cs b/samples/ControlCatalog/Pages/ScrollViewerPage.xaml.cs
new file mode 100644
index 0000000000..36d3768b13
--- /dev/null
+++ b/samples/ControlCatalog/Pages/ScrollViewerPage.xaml.cs
@@ -0,0 +1,65 @@
+using System.Collections.Generic;
+using Avalonia.Controls;
+using Avalonia.Controls.Primitives;
+using Avalonia.Markup.Xaml;
+using ReactiveUI;
+
+namespace ControlCatalog.Pages
+{
+ public class ScrollViewerPageViewModel : ReactiveObject
+ {
+ private bool _allowAutoHide;
+ private ScrollBarVisibility _horizontalScrollVisibility;
+ private ScrollBarVisibility _verticalScrollVisibility;
+
+ public ScrollViewerPageViewModel()
+ {
+ AvailableVisibility = new List
+ {
+ ScrollBarVisibility.Auto,
+ ScrollBarVisibility.Visible,
+ ScrollBarVisibility.Hidden,
+ ScrollBarVisibility.Disabled,
+ };
+
+ HorizontalScrollVisibility = ScrollBarVisibility.Auto;
+ VerticalScrollVisibility = ScrollBarVisibility.Auto;
+ AllowAutoHide = true;
+ }
+
+ public bool AllowAutoHide
+ {
+ get => _allowAutoHide;
+ set => this.RaiseAndSetIfChanged(ref _allowAutoHide, value);
+ }
+
+ public ScrollBarVisibility HorizontalScrollVisibility
+ {
+ get => _horizontalScrollVisibility;
+ set => this.RaiseAndSetIfChanged(ref _horizontalScrollVisibility, value);
+ }
+
+ public ScrollBarVisibility VerticalScrollVisibility
+ {
+ get => _verticalScrollVisibility;
+ set => this.RaiseAndSetIfChanged(ref _verticalScrollVisibility, value);
+ }
+
+ public List AvailableVisibility { get; }
+ }
+
+ public class ScrollViewerPage : UserControl
+ {
+ public ScrollViewerPage()
+ {
+ InitializeComponent();
+
+ DataContext = new ScrollViewerPageViewModel();
+ }
+
+ private void InitializeComponent()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+ }
+}
diff --git a/src/Avalonia.Controls/Primitives/ScrollBar.cs b/src/Avalonia.Controls/Primitives/ScrollBar.cs
index f6186a29a9..fc82fcc7a7 100644
--- a/src/Avalonia.Controls/Primitives/ScrollBar.cs
+++ b/src/Avalonia.Controls/Primitives/ScrollBar.cs
@@ -3,6 +3,7 @@ using Avalonia.Data;
using Avalonia.Interactivity;
using Avalonia.Input;
using Avalonia.Layout;
+using Avalonia.Threading;
namespace Avalonia.Controls.Primitives
{
@@ -40,10 +41,26 @@ namespace Avalonia.Controls.Primitives
public static readonly StyledProperty OrientationProperty =
AvaloniaProperty.Register(nameof(Orientation), Orientation.Vertical);
+ ///
+ /// Defines the property.
+ ///
+ public static readonly DirectProperty IsExpandedProperty =
+ AvaloniaProperty.RegisterDirect(
+ nameof(IsExpanded),
+ o => o.IsExpanded);
+
+ ///
+ /// Defines the property.
+ ///
+ public static readonly StyledProperty AllowAutoHideProperty =
+ AvaloniaProperty.Register(nameof(AllowAutoHide), true);
+
private Button _lineUpButton;
private Button _lineDownButton;
private Button _pageUpButton;
private Button _pageDownButton;
+ private DispatcherTimer _timer;
+ private bool _isExpanded;
///
/// Initializes static members of the class.
@@ -90,6 +107,24 @@ namespace Avalonia.Controls.Primitives
set { SetValue(OrientationProperty, value); }
}
+ ///
+ /// Gets a value that indicates whether the scrollbar is expanded.
+ ///
+ public bool IsExpanded
+ {
+ get => _isExpanded;
+ private set => SetAndRaise(IsExpandedProperty, ref _isExpanded, value);
+ }
+
+ ///
+ /// Gets a value that indicates whether the scrollbar can hide itself when user is not interacting with it.
+ ///
+ public bool AllowAutoHide
+ {
+ get => GetValue(AllowAutoHideProperty);
+ set => SetValue(AllowAutoHideProperty, value);
+ }
+
public event EventHandler Scroll;
///
@@ -131,6 +166,10 @@ namespace Avalonia.Controls.Primitives
{
UpdatePseudoClasses(change.NewValue.GetValueOrDefault());
}
+ else if (change.Property == AllowAutoHideProperty)
+ {
+ UpdateIsExpandedState();
+ }
else
{
if (change.Property == MinimumProperty ||
@@ -143,6 +182,26 @@ namespace Avalonia.Controls.Primitives
}
}
+ protected override void OnPointerEnter(PointerEventArgs e)
+ {
+ base.OnPointerEnter(e);
+
+ if (AllowAutoHide)
+ {
+ ExpandAfterDelay();
+ }
+ }
+
+ protected override void OnPointerLeave(PointerEventArgs e)
+ {
+ base.OnPointerLeave(e);
+
+ if (AllowAutoHide)
+ {
+ CollapseAfterDelay();
+ }
+ }
+
protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
{
if (_lineUpButton != null)
@@ -170,8 +229,6 @@ namespace Avalonia.Controls.Primitives
_pageUpButton = e.NameScope.Find