From 7b686925095e563affc2a3f27ccf193bdbfac475 Mon Sep 17 00:00:00 2001 From: NaBian <836904362@qq.com> Date: Wed, 8 Jun 2022 22:48:34 +0800 Subject: [PATCH] chore: add IsDisabled prop for ScrollViewerAttach. --- .../Controls/Attach/ScrollViewerAttach.cs | 61 ++++++++++++++++--- 1 file changed, 53 insertions(+), 8 deletions(-) diff --git a/src/Shared/HandyControl_Shared/Controls/Attach/ScrollViewerAttach.cs b/src/Shared/HandyControl_Shared/Controls/Attach/ScrollViewerAttach.cs index 1f35f9c0..b49739ac 100644 --- a/src/Shared/HandyControl_Shared/Controls/Attach/ScrollViewerAttach.cs +++ b/src/Shared/HandyControl_Shared/Controls/Attach/ScrollViewerAttach.cs @@ -1,7 +1,9 @@ using System; using System.Windows; using System.Windows.Controls; +using System.Windows.Input; using HandyControl.Data; +using HandyControl.Tools; namespace HandyControl.Controls; @@ -30,21 +32,21 @@ public class ScrollViewerAttach { if ((Orientation) e.NewValue == Orientation.Horizontal) { - scrollViewer.PreviewMouseWheel += ScrollViewer_PreviewMouseWheel; + scrollViewer.PreviewMouseWheel += ScrollViewerPreviewMouseWheel; } else { - scrollViewer.PreviewMouseWheel -= ScrollViewer_PreviewMouseWheel; + scrollViewer.PreviewMouseWheel -= ScrollViewerPreviewMouseWheel; } } - } - private static void ScrollViewer_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e) - { - var scrollViewer = (System.Windows.Controls.ScrollViewer) sender; - scrollViewer.ScrollToHorizontalOffset(Math.Min(Math.Max(0, scrollViewer.HorizontalOffset - e.Delta), scrollViewer.ScrollableWidth)); + void ScrollViewerPreviewMouseWheel(object sender, MouseWheelEventArgs args) + { + var scrollViewerNative = (System.Windows.Controls.ScrollViewer) sender; + scrollViewerNative.ScrollToHorizontalOffset(Math.Min(Math.Max(0, scrollViewerNative.HorizontalOffset - args.Delta), scrollViewerNative.ScrollableWidth)); - e.Handled = true; + args.Handled = true; + } } public static void SetOrientation(DependencyObject element, Orientation value) @@ -52,4 +54,47 @@ public class ScrollViewerAttach public static Orientation GetOrientation(DependencyObject element) => (Orientation) element.GetValue(OrientationProperty); + + public static readonly DependencyProperty IsDisabledProperty = DependencyProperty.RegisterAttached( + "IsDisabled", typeof(bool), typeof(ScrollViewerAttach), new PropertyMetadata(ValueBoxes.FalseBox, OnIsDisabledChanged)); + + private static void OnIsDisabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is UIElement element) + { + if ((bool)e.NewValue) + { + element.PreviewMouseWheel += ScrollViewerPreviewMouseWheel; + } + else + { + element.PreviewMouseWheel -= ScrollViewerPreviewMouseWheel; + } + } + + void ScrollViewerPreviewMouseWheel(object sender, MouseWheelEventArgs args) + { + if (args.Handled) + { + return; + } + + args.Handled = true; + + if (VisualHelper.GetParent((UIElement) sender) is { } scrollViewer) + { + scrollViewer.RaiseEvent(new MouseWheelEventArgs(args.MouseDevice, args.Timestamp, args.Delta) + { + RoutedEvent = UIElement.MouseWheelEvent, + Source = sender + }); + } + } + } + + public static void SetIsDisabled(DependencyObject element, bool value) + => element.SetValue(IsDisabledProperty, ValueBoxes.BooleanBox(value)); + + public static bool GetIsDisabled(DependencyObject element) + => (bool) element.GetValue(IsDisabledProperty); }