@@ -4,6 +4,8 @@ namespace MaterialDesignThemes.Wpf.Behaviors;
44
55internal class TextBoxHorizontalScrollBarBehavior : Behavior < ScrollViewer >
66{
7+ private ScrollBar ? _builtInScrollBar ;
8+
79 public static readonly DependencyProperty TargetScrollBarProperty =
810 DependencyProperty . Register ( nameof ( TargetScrollBar ) , typeof ( ScrollBar ) , typeof ( TextBoxHorizontalScrollBarBehavior ) , new PropertyMetadata ( null , TargetScrollBarChanged ) ) ;
911 public ScrollBar TargetScrollBar
@@ -26,28 +28,56 @@ private static void TargetScrollBarChanged(DependencyObject d, DependencyPropert
2628 }
2729 }
2830
31+ public static readonly DependencyProperty TargetScrollBarVisibilityProperty =
32+ DependencyProperty . Register ( nameof ( TargetScrollBarVisibility ) , typeof ( ScrollBarVisibility ) , typeof ( TextBoxHorizontalScrollBarBehavior ) , new PropertyMetadata ( ScrollBarVisibility . Auto ) ) ;
33+ public ScrollBarVisibility TargetScrollBarVisibility
34+ {
35+ get => ( ScrollBarVisibility ) GetValue ( TargetScrollBarVisibilityProperty ) ;
36+ set => SetValue ( TargetScrollBarVisibilityProperty , value ) ;
37+ }
38+
2939 private void TargetScrollBar_OnScroll ( object sender , ScrollEventArgs e )
3040 {
3141 if ( AssociatedObject is not { } ao ) return ;
3242 ao . ScrollToHorizontalOffset ( e . NewValue ) ;
3343 }
3444
3545 private void AssociatedObject_Loaded ( object sender , RoutedEventArgs e )
36- => AssociatedObject . HorizontalScrollBarVisibility = ScrollBarVisibility . Hidden ;
46+ {
47+ AssociatedObject . HorizontalScrollBarVisibility = ScrollBarVisibility . Hidden ;
48+ _builtInScrollBar = AssociatedObject . FindChild < ScrollBar > ( "PART_HorizontalScrollBar" ) ;
49+ }
3750
3851 private void AssociatedObject_SizeChanged ( object sender , SizeChangedEventArgs e )
3952 {
4053 if ( TargetScrollBar is not { } ts ) return ;
4154
4255 ts . ViewportSize = AssociatedObject . ViewportWidth ;
43- ts . Maximum = AssociatedObject . ScrollableWidth ;
56+ ts . Value = AssociatedObject . HorizontalOffset ;
57+ ts . Maximum = _builtInScrollBar ! . Maximum ;
58+ UpdateTargetScrollBarVisibility ( _builtInScrollBar ! . Maximum > 0 ) ;
4459 }
4560
4661 private void AssociatedObject_ScrollChanged ( object sender , ScrollChangedEventArgs e )
4762 {
4863 if ( TargetScrollBar is not { } ts ) return ;
4964
5065 ts . Value = AssociatedObject . HorizontalOffset ;
66+ ts . Maximum = _builtInScrollBar ! . Maximum ;
67+ UpdateTargetScrollBarVisibility ( _builtInScrollBar ! . Maximum > 0 ) ;
68+ }
69+
70+ private void UpdateTargetScrollBarVisibility ( bool showIfRequired )
71+ {
72+ if ( TargetScrollBar is not { } ts ) return ;
73+
74+ AssociatedObject . HorizontalScrollBarVisibility = ScrollBarVisibility . Hidden ;
75+ ts . Visibility = TargetScrollBarVisibility switch
76+ {
77+ ScrollBarVisibility . Hidden or ScrollBarVisibility . Disabled => Visibility . Collapsed ,
78+ ScrollBarVisibility . Visible => Visibility . Visible ,
79+ _ => showIfRequired ? Visibility . Visible : Visibility . Collapsed ,
80+ } ;
5181 }
5282
5383 protected override void OnAttached ( )
@@ -58,7 +88,6 @@ protected override void OnAttached()
5888 AssociatedObject . ScrollChanged += AssociatedObject_ScrollChanged ;
5989 }
6090
61-
6291 protected override void OnDetaching ( )
6392 {
6493 if ( AssociatedObject is { } ao )
0 commit comments