Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 滚动条移动时停止刷新列表框_C#_Wpf_Listbox_Scrollview_Scrollbar - Fatal编程技术网

C# 滚动条移动时停止刷新列表框

C# 滚动条移动时停止刷新列表框,c#,wpf,listbox,scrollview,scrollbar,C#,Wpf,Listbox,Scrollview,Scrollbar,是否可以在滚动时停止刷新列表框内容,并仅在释放鼠标左键后才进行刷新?您需要配置ListBox的ScrollViewer,通过设置附加属性来延迟内容呈现: 请注意,ScrollViewer.ScrollChanged在每次索引更改时或IsDeferredScrolling=True仅在释放滚动条并滚动完成后才会出现。请参见此。TL;DR-使用列表视图,而不是列表框。有效,谢谢。在这样的滚动过程中,是否可以轻松提取第一个“可见”元素的索引?我以前使用过,但现在它返回了一些不同的内容。我更新了我的答案

是否可以在滚动时停止刷新列表框内容,并仅在释放鼠标左键后才进行刷新?

您需要配置
ListBox
ScrollViewer
,通过设置附加属性来延迟内容呈现:


请注意,
ScrollViewer.ScrollChanged
在每次索引更改时或
IsDeferredScrolling=True
仅在释放滚动条并滚动完成后才会出现。

请参见此。TL;DR-使用
列表视图
,而不是
列表框
。有效,谢谢。在这样的滚动过程中,是否可以轻松提取第一个“可见”元素的索引?我以前使用过,但现在它返回了一些不同的内容。我更新了我的答案,以显示如何获取第一个可见项。如果这对你不起作用,请告诉我。在这种情况下,还请告诉我有关
列表框的任何特殊配置,例如禁用的虚拟化。我有一个简单的滚动条气球,上面有列表中第一项的索引。设置
ScrollViewer.IsDeferredScrollingEnabled=“True”
时,仅在释放键时才获得值。我没有多余的装备。大文件将被加载,所以我想关闭内容刷新,因为它会严重冻结应用程序,同时知道我当前正在滚动哪个索引。此控制是否可能?是的,可能。但是当使用延迟滚动时,这会变得更加复杂。在执行此操作之前,我们应该确保正确使用内置性能特性以充分发挥作用。默认情况下,
ListBox
ListView
使用UI虚拟化。仅当渲染需要时才加载项容器。仅装载固定数量的容器,即一次生成。现在的目标是确保使用UI虚拟化并最大化渲染速度。我们想禁用延迟滚动,但仍然可以平滑滚动!请检查:1)您没有将
CanContentScroll
设置为
false
2)您没有将
IsVirtualization
设置为
false
3)您仅使用数据绑定将数据添加到
ItemsSource
4)源集合中只包含一种数据类型,并且只定义了一个
DataTemplate
布局项目容器——如果任何一点可以用false回答,那么虚拟化将被隐式禁用。
<ListBox ScrollViewer.IsDeferredScrolling="True"  />
<ListBox ScrollViewer.IsDeferredScrolling="True"   
         ScrollViewer.ScrollChanged="OnScrollChanged" />

private void OnScrollChanged(object sender, ScrollChangedEventArgs e)
{
  var listBox = sender as System.Windows.Controls.ListBox;

  var firstVisibleItem = listBox.Items[(int) e.VerticalOffset];
}