WPF开发者QQ群: 340500857  | 微信群 -> 进入公众号主页 加入组织

欢迎转发、分享、点赞、在看,谢谢~。

前言

看了看原生UWP的ScrollViewer,滑动很流畅(例如 开始菜单),但是WPF自带的ScrollViewer滚动十分生硬..

突发奇想,今天来实现一个流畅滚动的ScrollViewer.

01

效果预览

效果预览(更多效果请下载源码体验):

02

代码如下

一、ScrollViewerBehavior.cs 代码如下

using System.Windows;
using System.Windows.Controls;namespace WPFDevelopers.Controls
{public static class ScrollViewerBehavior{public static readonly DependencyProperty VerticalOffsetProperty = DependencyProperty.RegisterAttached("VerticalOffset", typeof(double), typeof(ScrollViewerBehavior), new UIPropertyMetadata(0.0, OnVerticalOffsetChanged));public static void SetVerticalOffset(FrameworkElement target, double value) => target.SetValue(VerticalOffsetProperty, value);public static double GetVerticalOffset(FrameworkElement target) => (double)target.GetValue(VerticalOffsetProperty);private static void OnVerticalOffsetChanged(DependencyObject target, DependencyPropertyChangedEventArgs e) => (target as ScrollViewer)?.ScrollToVerticalOffset((double)e.NewValue);}
}

二、ScrollViewerAnimation.cs 代码如下

using System;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media.Animation;namespace WPFDevelopers.Controls
{public class ScrollViewerAnimation : ScrollViewer{//记录上一次的滚动位置private double LastLocation = 0;//重写鼠标滚动事件protected override void OnMouseWheel(MouseWheelEventArgs e){double WheelChange = e.Delta;//可以更改一次滚动的距离倍数 (WheelChange可能为正负数!)double newOffset = LastLocation - (WheelChange * 2);//Animation并不会改变真正的VerticalOffset(只是它的依赖属性) 所以将VOffset设置到上一次的滚动位置 (相当于衔接上一个动画)ScrollToVerticalOffset(LastLocation);//碰到底部和顶部时的处理if (newOffset < 0)newOffset = 0;if (newOffset > ScrollableHeight)newOffset = ScrollableHeight;AnimateScroll(newOffset);LastLocation = newOffset;//告诉ScrollViewer我们已经完成了滚动e.Handled = true;}private void AnimateScroll(double ToValue){//为了避免重复,先结束掉上一个动画BeginAnimation(ScrollViewerBehavior.VerticalOffsetProperty, null);DoubleAnimation Animation = new DoubleAnimation();Animation.EasingFunction = new CubicEase() { EasingMode = EasingMode.EaseOut };Animation.From = VerticalOffset;Animation.To = ToValue;//动画速度Animation.Duration = TimeSpan.FromMilliseconds(800);//考虑到性能,可以降低动画帧数//Timeline.SetDesiredFrameRate(Animation, 40);BeginAnimation(ScrollViewerBehavior.VerticalOffsetProperty, Animation);}}
}

使用方法:直接创建 <ScrollViewerAnimation/>

如果是在ListBox中,可以通过修改模板的方式,把<ScrollViewer/>换成ScrollViewerAnimation即可.

三、ScrollViewerAnimationExample.xaml 代码如下

<wpfdev:ScrollViewerAnimation Width="200" MaxHeight="300"ScrollViewer.VerticalScrollBarVisibility="Hidden"><ItemsControl ItemsSource="{Binding NavigateMenuModelList}"><ItemsControl.ItemTemplate><DataTemplate><Border Background="{StaticResource SuccessSolidColorBrush}"BorderThickness="0,0,0,.3" BorderBrush="{StaticResource WhiteSolidColorBrush}"><TextBlock Text="{Binding Name}" Padding="10" FontSize="{StaticResource NormalFontSize}"Foreground="{StaticResource WhiteSolidColorBrush}"/></Border></DataTemplate></ItemsControl.ItemTemplate><ItemsControl.ItemsPanel><ItemsPanelTemplate><VirtualizingStackPanel/></ItemsPanelTemplate></ItemsControl.ItemsPanel></ItemsControl></wpfdev:ScrollViewerAnimation>

源码地址

github:https://github.com/yanjinhuagood/WPFDevelopers.git

gitee:https://gitee.com/yanjinhua/WPFDevelopers.git

WPF开发者QQ群: 340500857

blogs: https://www.cnblogs.com/yanjinhua

Github:https://github.com/yanjinhuagood

出处:https://www.cnblogs.com/yanjinhua

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

转载请著名作者 出处 https://github.com/yanjinhuagood

WPF 如何流畅地滚动ScrollViewer相关推荐

  1. 在WPF中实现平滑滚动

    原文:在WPF中实现平滑滚动 WPF实现滚动条还是比较方便的,只要在控件外围加上ScrollViewer即可,但美中不足的是:滚动的时候没有动画效果.在滚动的时候添加过渡动画能给我们的软件增色不少,例 ...

  2. WPF 可触摸移动的ScrollViewer控件

    原文:WPF 可触摸移动的ScrollViewer控件 ListBox支持触摸滑动,而ScrollViewer默认不支持. ScrollViewer如需要添加上下/左右触摸移动,需要在Touch事件中 ...

  3. wpf html5 流畅性,iPad浏览器HTML5性能测试

    截至到目前为止,各浏览器厂商的全球市场占有率如下图所示: 图1- 1各大浏览器市场占有率 数据来源: http://gs.statcounter.com/browser-market-share 01 ...

  4. WPF中DataGrid自动滚动,跑马灯效果实现

    前端: <DataGrid x:Name="dg" AutoGenerateColumns="False" ><DataGrid.Column ...

  5. 分享Silverlight/Windows8/WPF/WP7/HTML5一周学习导读(5月14日-5月20日)

    分享Silverlight/Windows8/WPF/WP7/HTML5一周学习导读(5月14日-5月20日) 本周Silverlight学习资源更新 MVVM设计模式相关--Silverlight商 ...

  6. 分享Silverlight/WPF/Windows Phone一周学习导读(8月28日-9月3日)

    分享Silverlight/WPF/Windows Phone一周学习导读(8月28日-9月3日) 本周Silverlight学习资源更新: Silverlight动画 cutylongshen Si ...

  7. 2019-10-7-dotnet-Framework-源代码-·-ScrollViewer

    title author date CreateTime categories dotnet Framework 源代码 · ScrollViewer lindexi 2019-10-07 13:15 ...

  8. .net Framework 源代码 · ScrollViewer

    本文是分析 .net Framework 源代码的系列,主要告诉大家微软做 ScrollViewer 的思路,分析很简单. 看完本文,可以学会如何写一个 ScrollViewer ,如何定义一个 IS ...

  9. 背水一战 Windows 10 (47) - 控件(ScrollViewer 特性): Chaining, Rail, Inertia, Snap, Zoom

    原文:背水一战 Windows 10 (47) - 控件(ScrollViewer 特性): Chaining, Rail, Inertia, Snap, Zoom [源码下载] 背水一战 Windo ...

最新文章

  1. 人群密度估计--Crowd Counting Via Scale-adaptive Convolutional Nerual Network
  2. CALayer-层的属性
  3. Java 反射 方法调用
  4. 京东AI一把手周伯文被曝离职创业,曾任技术委员会主席,毕业于中科大少年班...
  5. HarmonyOS应用开发者门户,HarmonyOS 手机应用开发者 Beta 版到来,对开发者意味着什么...
  6. SSM框架知识点复习
  7. android view setleft,android – 在新textview上使用setLeft / setRight方法
  8. css中选择器的使用
  9. (转) C#网速监测
  10. 恒压板框过滤实验数据处理_中学少见、高考常考的化学实验仪器
  11. 转发:已经足够好用的IDEA社区版
  12. .rpt文件内容读取java_Java中读取File文件内容转为String类型
  13. spring Boot手把手教学(8): 封装统一返回实体类
  14. 解决序列长期依赖的法宝——注意力机制
  15. 用python绘制y=x,y=1+sinx,编写Python程序,使用numpy、pandas、matplotlib三个扩展库在一个画布中绘制4个子图.
  16. 手机摄影技巧总结——永远拍出美美的照片
  17. 产品经理在公司一般都是干什么?
  18. text-align 和 align的区别
  19. JAVA 多个空格分割字符串
  20. Android:Umeng(友盟)消息推送(二)

热门文章

  1. ciscodk新科目——1Z1-807
  2. DirectSound 混音的实现
  3. 使用tab键分割的文章能快速转换成表格。( )_EXCEL的163种使用技巧集锦-42~62
  4. 使用window.postMessage实现跨域通信
  5. 7.18 collection random os sys等模块
  6. 734. [网络流24题] 方格取数问题 二分图点权最大独立集/最小割/最大流
  7. poj 2398 Toy Storage (计算几何,判断点和线段关系)
  8. 研究生计划-心得征程
  9. [导入]心平气和,千佳骈集;意粗性躁,一事无成
  10. Teams数据统计 - 用户在线离线状态