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