如何判断ScrollViewer是否已经滚动到底部?

weixin_38051062 2017-11-29 06:24:03
一个ListBox,里面的内容可以滚动,我想判断是否已经滚动到了底部,在网上找到这个程序:

但是不知道为什么,无论我怎么滚动,VerticalOffset、 ViewportHeight、 ExtentHeight这三个数值都是一样的,没有任何变化。
VerticalOffset按理说相当于HTML里面的scrollTop,当我滚动滚动条的时候,这个值应该会随着发生变化,可是实际上却没有。

ViewportHeight应该是ListBox的可见区域的高度吗?我这边返回29,而实际ListBox的高度比这个大很多。。。
请问这是为什么。。。。

da jia hao!
...全文
329 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38108228 2017-12-06
  • 打赏
  • 举报
回复
我调试了一下:

到底ViewportHeight和ExtendHeight是什么?为什么是29和30?他根本就不是我的listbox的高度。。。
当我滚动的时候,VerticalOffset的确发生变化了,但是绝对不是已经滚动的偏移量,这和我在HTML里面的scrollTop并不是一个概念?那他到底代表了什么意思呢?
da jia hao!
weixin_38105732 2017-12-06
  • 打赏
  • 举报
回复
谢谢,这个有效。
不过,为什么我并没有滚动listbox,仅仅只是通过代码添加listboxitem,也一样会触发ScrollChanged事件啊?da jia hao!
weixin_38095580 2017-12-06
  • 打赏
  • 举报
回复

你好,

ViewportHeight是指可见区域的高度。

ExtendHeight是指整个ScrollViewer的内容高度。

ScrollViewer分为逻辑滚动和物理滚动。

逻辑滚动:  设置 CanContentScroll="True",通过计算viewport 和 extent得到相对大小。

物理滚动(默认): 设置 CanContentScroll="False", 按像素滚动,更加平滑。

请可以参考一下文章:

http://blog.csdn.net/gqqnb/article/details/7745912

https://stackoverflow.com/questions/5733738/scrollviewers-viewport-height-vs-actual-height

(官方解释):https://msdn.microsoft.com/zh-cn/library/ms750665(v=vs.110).aspx

Sincerely,

Bob




weixin_38112462 2017-12-06
  • 打赏
  • 举报
回复

你好,

ViewportHeight是指可见区域的高度。

ExtendHeight是指整个ScrollViewer的内容高度。

ScrollViewer分为逻辑滚动和物理滚动。

逻辑滚动:  设置 CanContentScroll="True",通过计算viewport 和 extent得到相对大小。

物理滚动(默认): 设置 CanContentScroll="False", 按像素滚动,更加平滑。

请可以参考一下文章:

http://blog.csdn.net/gqqnb/article/details/7745912

https://stackoverflow.com/questions/5733738/scrollviewers-viewport-height-vs-actual-height

(官方解释):https://msdn.microsoft.com/zh-cn/library/ms750665(v=vs.110).aspx

Sincerely,

Bob




weixin_38101771 2017-11-29
  • 打赏
  • 举报
回复
Hi,
处理 Listbox ScrollViewer.ScrollChanged事件。
private void listbox_ScrollChanged(object sender, ScrollChangedEventArgs e) { ScrollViewer sv = FindChild<ScrollViewer>(listbox2); if (e.VerticalOffset + e.ViewportHeight == e.ExtentHeight && e.ViewportHeight != 0) MessageBox.Show("到底了"); } public static T FindChild<T>(DependencyObject parent) where T : DependencyObject { // confirm parent is valid. if (parent == null) return null; if (parent is T) return parent as T; DependencyObject foundChild = null; if (parent is FrameworkElement) (parent as FrameworkElement).ApplyTemplate(); int childrenCount = VisualTreeHelper.GetChildrenCount(parent); for (int i = 0; i < childrenCount; i++) { var child = VisualTreeHelper.GetChild(parent, i); foundChild = FindChild<T>(child); if (foundChild != null) break; } return foundChild as T; }
Sincerely,
Bob


weixin_38084861 2017-11-29
  • 打赏
  • 举报
回复
Hi,
处理 Listbox ScrollViewer.ScrollChanged事件。
private void listbox_ScrollChanged(object sender, ScrollChangedEventArgs e) { ScrollViewer sv = FindChild<ScrollViewer>(listbox2); if (e.VerticalOffset + e.ViewportHeight == e.ExtentHeight && e.ViewportHeight != 0) MessageBox.Show("到底了"); } public static T FindChild<T>(DependencyObject parent) where T : DependencyObject { // confirm parent is valid. if (parent == null) return null; if (parent is T) return parent as T; DependencyObject foundChild = null; if (parent is FrameworkElement) (parent as FrameworkElement).ApplyTemplate(); int childrenCount = VisualTreeHelper.GetChildrenCount(parent); for (int i = 0; i < childrenCount; i++) { var child = VisualTreeHelper.GetChild(parent, i); foundChild = FindChild<T>(child); if (foundChild != null) break; } return foundChild as T; }
Sincerely,
Bob


weixin_38098895 2017-11-29
  • 打赏
  • 举报
回复
代码:
ScrollViewer sv = GetVisualChild<ScrollViewer>(TransferListView); MessageBox.Show(string.Format("VerticalOffset:{0} ViewportHeight:{1} ExtentHeight:{2}", sv.VerticalOffset, sv.ViewportHeight, sv.ExtentHeight)); public static T GetVisualChild<T>(UIElement parent) where T : UIElement { T child = null; // default(T); int numVisuals = VisualTreeHelper.GetChildrenCount(parent); for (int i = 0; i < numVisuals; i++) { UIElement element = (UIElement)VisualTreeHelper.GetChild(parent, i); child = element as T; if (child == null) child = GetVisualChild<T>(element); if (child != null) break; } return child; }

da jia hao!

473

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧