-
Notifications
You must be signed in to change notification settings - Fork 3.5k
Expand file tree
/
Copy pathPaddedBringIntoViewStackPanel.cs
More file actions
63 lines (52 loc) · 2.37 KB
/
PaddedBringIntoViewStackPanel.cs
File metadata and controls
63 lines (52 loc) · 2.37 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
using MaterialDesignThemes.Wpf.Behaviors.Internal;
namespace MaterialDesignThemes.Wpf.Internal;
public class PaddedBringIntoViewStackPanel : StackPanel
{
public TabScrollDirection ScrollDirection
{
get => (TabScrollDirection)GetValue(ScrollDirectionProperty);
set => SetValue(ScrollDirectionProperty, value);
}
public static readonly DependencyProperty ScrollDirectionProperty =
DependencyProperty.Register(nameof(ScrollDirection), typeof(TabScrollDirection),
typeof(PaddedBringIntoViewStackPanel), new PropertyMetadata(TabScrollDirection.Unknown));
public double HeaderPadding
{
get => (double)GetValue(HeaderPaddingProperty);
set => SetValue(HeaderPaddingProperty, value);
}
public static readonly DependencyProperty HeaderPaddingProperty =
DependencyProperty.Register(nameof(HeaderPadding),
typeof(double), typeof(PaddedBringIntoViewStackPanel), new PropertyMetadata(0d));
public bool UseHeaderPadding
{
get => (bool)GetValue(UseHeaderPaddingProperty);
set => SetValue(UseHeaderPaddingProperty, value);
}
public static readonly DependencyProperty UseHeaderPaddingProperty =
DependencyProperty.Register(nameof(UseHeaderPadding), typeof(bool), typeof(PaddedBringIntoViewStackPanel), new PropertyMetadata(false));
static PaddedBringIntoViewStackPanel()
=> EventManager.RegisterClassHandler(typeof(PaddedBringIntoViewStackPanel),
FrameworkElement.RequestBringIntoViewEvent,
new RequestBringIntoViewEventHandler(OnRequestBringIntoView));
private static void OnRequestBringIntoView(object sender, RoutedEventArgs e)
{
var panel = (PaddedBringIntoViewStackPanel)sender;
if (!panel.UseHeaderPadding)
return;
if (e.OriginalSource is FrameworkElement child && child != panel)
{
e.Handled = true;
double offset = panel.ScrollDirection switch
{
TabScrollDirection.Backward => -panel.HeaderPadding,
TabScrollDirection.Forward => panel.HeaderPadding,
_ => 0
};
var point = child.TranslatePoint(new Point(), panel);
var newTargetRect = new Rect(new Point(point.X + offset, point.Y), child.RenderSize);
panel.BringIntoView(newTargetRect);
}
}
}