[WPF][数据网格]动态加载 od 元素的 DataGrid 滚动问题

Hui Liu-MSFT 48,711 信誉分 Microsoft 外部员工
2024-05-29T07:19:58.27+00:00

你好

我想使用 Datagrid 按 1000 个元素的组加载数据。每次滚动条在底部时,我都会加载 1000 个新元素。 它一直有效,直到我加载我的前 1000 个新元素。scrollBar 的拇指不会向上,但仍在底部。所以我必须上下加载 1000 个新元素。 我覆盖了 ScrollViewer::OnScrollChanged() 以查看发生了什么,但我不明白结果。我的 VerticalOffset 增加了 1000 个元素,没有任何缺点!

这里是 ScrollViewer::OnScrollChanged(ScrollChangedEventArgs e) 的一些日志 步骤 1 => 使用 1000 个元素 进行初始化 信息 e.ExtentHeightChange: 0 信息 e.VerticalOffset: 0 信息 e.ExtentHeight: 1000 信息 e.VerticalChange: 0 信息 e.ViewportHeight: 18 信息 e.ViewportHeightChange: 0

步骤 2 => 滚动到滚动条 的底部 信息 e.ExtentHeight:1000 信息 e.ExtentHeightChange:0 信息 e.VerticalOffset:983 信息 e.VerticalChange:81,1970343742979 信息 e.ViewportHeight:17 信息 e.ViewportHeightChange:-1

步骤 2 =>新数据的加载发生 => 在 Datagrid 中添加 1000 个元素 信息 e.ExtentHeight:2000 信息 e.ExtentHeightChange:1000 信息 e.VerticalOffset:1983 <= 我的问题信息 e.VerticalChange:1000 信息 e.ViewportHeight:17 信息 e.ViewportHeightChange:0

我在这里期望的是 verticalOffset 保持在 983,我的滚动条的拇指会自行上升

第 3 步:我上下滚动一点 => 在 dataGrid 中添加 1000 个元素 信息 e.ExtentHeight:3000 信息 e.ExtentHeightChange:1000 信息 e.VerticalOffset:2983 <= 相同的问题 信息 e.VerticalChange:1000 信息 e.ViewportHeight:17 信息 e.ViewportHeightChange:0

第 4 步:我上下滚动一点 =>在 dataGrid 中添加 1000 个元素 信息 e.ExtentHeight:4000 信息 e.ExtentHeightChange:1000 信息 e.VerticalOffset:3983 <= 相同的问题 信息 e.VerticalChange:1000 信息 e.ViewportHeight:17 信息 e.ViewportHeightChange:0

我必须每次都向上向下滚动,这不符合人体工程学。 如何在滚动之前将我的 VerticalOffset 保持在相同的值?

注意:出于性能和人体工程学原因,我按 1000 个元素集加载数据。数据总数可能为 300 000 个或更多

如果有人有解决方案,那将是非常有帮助的。 感谢您的帮助和时间

Note:此问题总结整理于:[WPF][DATAGRID] DataGrid scroll problem with dynamic load od elements

开发人员技术 | Windows Presentation Foundation
0 个注释 无注释
{count} 票

问题作者接受的答案
  1. 匿名
    2024-05-29T08:37:41.0833333+00:00

    ScrollViewer.VerticalOffset是用来获取一个包含滚动内容的垂直偏移量的值,它没有设置方法,不能直接给它设置值,更多信息可以参考ScrollViewer.VerticalOffset属性。您可以使用指定的垂直偏移位置,并设置为在用户拖动 ScrollBar 的 Thumb 时保持内容静止。ScrollToVerticalOffsetIsDeferredScrollingEnabled = true

    请将 event 和 event 添加到您的 中,并在 cs 中实现以下代码:SizeChangedLoadedDataGrid

    ScrollViewer sv1;  
            private void dataGrid_SizeChanged(object sender, SizeChangedEventArgs e)  
            {  
                sv1 = VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(this.dataGrid, 0), 0) as ScrollViewer;  
                sv1.IsDeferredScrollingEnabled = true;  
                sv1.ScrollToVerticalOffset(123);  
            }  
      
            private void dataGrid_Loaded(object sender, RoutedEventArgs e)  
            {  
                sv1 = VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(this.dataGrid, 0), 0) as ScrollViewer;  
                sv1.IsDeferredScrollingEnabled = true;  
                sv1.ScrollToVerticalOffset(123);  
            }  
    

    顺便说一句,如果我误解了你的问题,请指出。


    如果答案是正确的,请点击“接受答案”并点赞。 如果您对此答案还有其他疑问,请点击“评论”。

    注意:如果您想接收相关电子邮件,请按照我们的文档中的步骤启用电子邮件通知 此线程的通知。

    0 个注释 无注释

0 个其他答案

排序依据: 非常有帮助

你的答案

提问者可以将答案标记为“已接受”,版主可以将答案标记为“已推荐”,这有助于用户了解答案是否解决了提问者的问题。