ListBox 是否滚动到底部
public class MyListBox: ListBox { public MyListBox() : base() { AddHandler(ScrollViewer.ScrollChangedEvent, new ScrollChangedEventHandler(ScrollView_ScrollChanged), true); } #region 是否滚动到底部 private void ScrollView_ScrollChanged(object sender, ScrollChangedEventArgs e) { if (e.OriginalSource is ScrollViewer scrollViewer) { var isBottom = ListBoxHelper.IsVerticalScrollBarAtButtom(scrollViewer); SetIsScrolledBottom(this, isBottom); } } /// <summary> /// 判断ScrollViewer是否滚动到底部 /// </summary> /// <param name="scrollViewer"></param> /// <returns></returns> public static bool IsScrolledToButtom(ScrollViewer scrollViewer) { var isBottom = false; if (Math.Abs(scrollViewer.VerticalOffset) > 0) { if (scrollViewer.VerticalOffset + scrollViewer.ViewportHeight == scrollViewer.ExtentHeight) { isBottom = true; } } if (scrollViewer.VerticalScrollBarVisibility == ScrollBarVisibility.Disabled || scrollViewer.VerticalScrollBarVisibility == ScrollBarVisibility.Hidden || scrollViewer.ScrollableHeight <= 0) { isBottom = true; } return isBottom; } public static readonly DependencyProperty IsScrolledBottomProperty = DependencyProperty.Register( "IsScrolledBottom", typeof(bool), typeof(MyListBox), new PropertyMetadata(default(bool))); public static void SetIsScrolledBottom(DependencyObject element, bool value) { element.SetValue(IsScrolledBottomProperty, value); } public static bool GetIsScrolledBottom(DependencyObject element) { return (bool)element.GetValue(IsScrolledBottomProperty); } #endregion }
属性IsScrolledBottom,表示当前已经滚动到底部
PS:上面写法还是有点小问题。
当前列表没有触发滚动到底部后,往列表中添加数据,添加过程中并不会触发ScrollChanged。
然后属性IsScrolledBottom就不准确了。
解决:对ListBox.Items.CollectionChanged添加监听,在触发事件中,调用IsScrolledToButtom方法,主动获取并设置当前IsScrolledBottom属性
分类:
WPF/Silverlight
, .NET
标签:
ListBox
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)