首页 > Windows开发 > 详细

[WPF]使用附加属性处理 ScrollViewer 的滚动轮劫持问题

时间:2020-06-08 22:17:04      阅读:51      评论:0      收藏:0      [点我收藏+]
原文:[WPF]使用附加属性处理 ScrollViewer 的滚动轮劫持问题

之前写过一篇博客 关于 ScrollViewer 和滚动轮劫持(scroll-wheel-hijack),里面介绍了 ScrollViewer 的滚动轮劫持问题,以及如果解决。当时的做法是继承 ScrollViewer 并重写 OnMouseWheel,全部代码如下:

Copy
public class ExtendedScrollViewer : ScrollViewer { protected override void OnMouseWheel(MouseWheelEventArgs e) { if (ViewportHeight + VerticalOffset >= ExtentHeight && e.Delta <= 0) return; if (VerticalOffset == 0 && e.Delta >= 0) return; base.OnMouseWheel(e); } }

最近有人提到能不能使用附加属性处理,所以我就试试。暂时发现简单地用附加属性处理,除非查找 VisualTree 上的父节点 ScrollView 并调用它的 LineUp 和 LineDown ,全部代码如下:

Copy
public class ScrollViewerService { /// <summary> /// 从指定元素获取 CanScrollOuter 依赖项属性的值。 /// </summary> /// <param name="obj">从中读取属性值的元素。</param> /// <returns>从属性存储获取的属性值。</returns> public static bool GetCanScrollOuter(DependencyObject obj) => (bool)obj.GetValue(CanScrollOuterProperty); /// <summary> /// 将 CanScrollOuter 依赖项属性的值设置为指定元素。 /// </summary> /// <param name="obj">对其设置属性值的元素。</param> /// <param name="value">要设置的值。</param> public static void SetCanScrollOuter(DependencyObject obj, bool value) => obj.SetValue(CanScrollOuterProperty, value); /// <summary> /// 标识 CanScrollOuter 依赖项属性。 /// </summary> public static readonly DependencyProperty CanScrollOuterProperty = DependencyProperty.RegisterAttached("CanScrollOuter", typeof(bool), typeof(ScrollViewerService), new PropertyMetadata(default(bool), OnCanScrollOuterChanged)); private static void OnCanScrollOuterChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) { var oldValue = (bool)args.OldValue; var newValue = (bool)args.NewValue; if (newValue == false) return; var target = obj as ScrollViewer; target.PreviewMouseWheel += (s, e) => { if (target.ViewportHeight + target.VerticalOffset >= target.ExtentHeight && e.Delta <= 0 || target.VerticalOffset == 0 && e.Delta >= 0) { var parent = target.GetVisualAncestors().OfType<ScrollViewer>().FirstOrDefault(); if (parent == null) return; if (e.Delta < 0) parent.LineDown(); else parent.LineUp(); } }; } }

处理不够优雅,但将就着用吧。

参考#

[UWP]附加属性1:概述

ScrollViewer.OnMouseWheel(MouseWheelEventArgs) Method (System.Windows.Controls) Microsoft Docs

MouseWheelEventArgs.Delta Property (System.Windows.Input) Microsoft Docs

ScrollViewer.ExtentHeight Property (System.Windows.Controls) Microsoft Docs

ScrollViewer.ViewportHeight Property (System.Windows.Controls) Microsoft Docs

ScrollViewer.VerticalOffset Property (System.Windows.Controls) Microsoft Docs

[WPF]使用附加属性处理 ScrollViewer 的滚动轮劫持问题

原文:https://www.cnblogs.com/lonelyxmas/p/13068755.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!