3using System.Windows.Input;
4using System.Windows.Media;
11 public static class NestedScrollViewersBehavior
13 public static readonly DependencyProperty DeferScrollingToParentWhenNeededProperty = DependencyProperty.RegisterAttached(
"DeferScrollingToParentWhenNeeded", typeof(
bool), typeof(NestedScrollViewersBehavior),
new PropertyMetadata(
false, OnDeferScrollingToParentWhenNeededChanged));
15 public static void SetIsEnabled(DependencyObject element,
bool value)
16 => element.SetValue(DeferScrollingToParentWhenNeededProperty, value);
18 public static bool GetIsEnabled(DependencyObject element)
19 => (bool)element.GetValue(DeferScrollingToParentWhenNeededProperty);
21 private static void OnDeferScrollingToParentWhenNeededChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
23 if (d is ScrollViewer scrollViewer)
27 scrollViewer.AddHandler(UIElement.PreviewMouseWheelEvent,
new MouseWheelEventHandler(OnPreviewMouseWheel),
true);
31 scrollViewer.RemoveHandler(UIElement.PreviewMouseWheelEvent,
new MouseWheelEventHandler(OnPreviewMouseWheel));
40 private static void OnPreviewMouseWheel(
object sender, MouseWheelEventArgs e)
42 if (sender is ScrollViewer senderScrollViewer && !e.Handled &&
43 ((e.Delta < 0 && senderScrollViewer.VerticalOffset == senderScrollViewer.ScrollableHeight)
44 || (e.Delta > 0 && senderScrollViewer.VerticalOffset == 0)))
47 MouseWheelEventArgs eventArg =
new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
48 eventArg.RoutedEvent = UIElement.MouseWheelEvent;
49 eventArg.Source = sender;
50 UIElement parent = ((Control)sender)?.Parent as UIElement;
51 parent?.RaiseEvent(eventArg);