Skip to content

Commit 92f0542

Browse files
TextBox.HorizontalScrollBarVisibility is now respected
1 parent f56b168 commit 92f0542

File tree

2 files changed

+33
-4
lines changed

2 files changed

+33
-4
lines changed

src/MaterialDesignThemes.Wpf/Behaviors/TextBoxHorizontalScrollBarBehavior.cs

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ namespace MaterialDesignThemes.Wpf.Behaviors;
44

55
internal 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)

src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TextBox.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@
175175
UseLayoutRounding="{TemplateBinding UseLayoutRounding}"
176176
VerticalScrollBarVisibility="Hidden">
177177
<b:Interaction.Behaviors>
178-
<behaviors:TextBoxHorizontalScrollBarBehavior TargetScrollBar="{Binding ElementName=CustomScrollBar}"/>
178+
<behaviors:TextBoxHorizontalScrollBarBehavior TargetScrollBar="{Binding ElementName=CustomScrollBar}" TargetScrollBarVisibility="{Binding RelativeSource={RelativeSource AncestorType=TextBox}, Path=HorizontalScrollBarVisibility}" />
179179
</b:Interaction.Behaviors>
180180
</ScrollViewer>
181181

0 commit comments

Comments
 (0)