-
Notifications
You must be signed in to change notification settings - Fork 3.5k
Expand file tree
/
Copy pathTextBoxHorizontalScrollBarBehavior.cs
More file actions
101 lines (85 loc) · 3.84 KB
/
TextBoxHorizontalScrollBarBehavior.cs
File metadata and controls
101 lines (85 loc) · 3.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
using Microsoft.Xaml.Behaviors;
namespace MaterialDesignThemes.Wpf.Behaviors.Internal;
public class TextBoxHorizontalScrollBarBehavior : Behavior<ScrollViewer>
{
private ScrollBar? _builtInScrollBar;
public static readonly DependencyProperty TargetScrollBarProperty =
DependencyProperty.Register(nameof(TargetScrollBar), typeof(ScrollBar), typeof(TextBoxHorizontalScrollBarBehavior), new PropertyMetadata(null, TargetScrollBarChanged));
public ScrollBar TargetScrollBar
{
get => (ScrollBar)GetValue(TargetScrollBarProperty);
set => SetValue(TargetScrollBarProperty, value);
}
private static void TargetScrollBarChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
TextBoxHorizontalScrollBarBehavior b = (TextBoxHorizontalScrollBarBehavior)d;
if (e.OldValue is ScrollBar oldValue)
{
oldValue.Scroll -= b.TargetScrollBar_OnScroll;
}
if (e.NewValue is ScrollBar newValue)
{
newValue.Scroll += b.TargetScrollBar_OnScroll;
}
}
public static readonly DependencyProperty TargetScrollBarVisibilityProperty =
DependencyProperty.Register(nameof(TargetScrollBarVisibility), typeof(ScrollBarVisibility), typeof(TextBoxHorizontalScrollBarBehavior), new PropertyMetadata(ScrollBarVisibility.Hidden));
public ScrollBarVisibility TargetScrollBarVisibility
{
get => (ScrollBarVisibility)GetValue(TargetScrollBarVisibilityProperty);
set => SetValue(TargetScrollBarVisibilityProperty, value);
}
private void TargetScrollBar_OnScroll(object sender, ScrollEventArgs e)
{
if (AssociatedObject is not { } ao) return;
ao.ScrollToHorizontalOffset(e.NewValue);
}
private void AssociatedObject_Loaded(object sender, RoutedEventArgs e)
{
AssociatedObject.HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden;
_builtInScrollBar = AssociatedObject.FindChild<ScrollBar>("PART_HorizontalScrollBar");
}
private void AssociatedObject_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (TargetScrollBar is not { } ts || _builtInScrollBar is null) return;
ts.ViewportSize = AssociatedObject.ViewportWidth;
ts.Value = AssociatedObject.HorizontalOffset;
ts.Maximum = _builtInScrollBar.Maximum;
UpdateTargetScrollBarVisibility(_builtInScrollBar.Maximum > 0);
}
private void AssociatedObject_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
if (TargetScrollBar is not { } ts || _builtInScrollBar is null) return;
ts.Value = AssociatedObject.HorizontalOffset;
ts.Maximum = _builtInScrollBar.Maximum;
UpdateTargetScrollBarVisibility(_builtInScrollBar.Maximum > 0);
}
private void UpdateTargetScrollBarVisibility(bool showIfRequired)
{
if (TargetScrollBar is not { } ts) return;
AssociatedObject.HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden;
ts.Visibility = TargetScrollBarVisibility switch
{
ScrollBarVisibility.Hidden or ScrollBarVisibility.Disabled => Visibility.Collapsed,
ScrollBarVisibility.Visible => Visibility.Visible,
_ => showIfRequired ? Visibility.Visible : Visibility.Collapsed,
};
}
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.Loaded += AssociatedObject_Loaded;
AssociatedObject.SizeChanged += AssociatedObject_SizeChanged;
AssociatedObject.ScrollChanged += AssociatedObject_ScrollChanged;
}
protected override void OnDetaching()
{
if (AssociatedObject is { } ao)
{
ao.Loaded -= AssociatedObject_Loaded;
ao.SizeChanged -= AssociatedObject_SizeChanged;
ao.ScrollChanged -= AssociatedObject_ScrollChanged;
}
base.OnDetaching();
}
}